[BCB6] Hook Klawiatury

Odpowiedz Nowy wątek
2004-09-24 12:16
Daniel
0

Potrzebuję pomocy,
czy ktoś może mi wyjaśnić czemu ten kod wykonywany jest dwukrotnie:

LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
  if (code < 0)
   {
     return CallNextHookEx(HookHandle,code,wParam,lParam);
   }
  if (wParam == VK_INSERT)
    {   
      TCanvas &Pulpit = *new TCanvas();
      Graphics::TBitmap *Bmp = new Graphics::TBitmap;
      Pulpit.Handle = GetDC(0);
      Bmp->Width = Screen->Width;
      Bmp->Height = Screen->Height;
      Bmp->Canvas->CopyRect(Rect(0,0,Screen->Width,Screen->Height), &Pulpit, Rect(0,0,Screen->Width,Screen->Height));

      Clipboard()->Assign(Bmp);

      ReleaseDC(0, Pulpit.Handle);
      delete Bmp;

      ShowWindow(hHandle, SW_SHOW);
      Sleep(200);
      if (hHandle)
        {
          ShowMessage(S2);
          //SendMessage(hHandle, MYMESSAGE, 0, 0);         
        }
      else
        {
          ShowMessage("niema");
        }
    }
  // wywołanie nastepnego hooka w lancuchu
  return CallNextHookEx(HookHandle, code, wParam, lParam);
}

Dokładnie chodzi mi o to, że po naciśnięciu INSERT pojawia mi się dwukrotnie komunikat z ShowMessage.

Drugie pytanie
Uhwyt okna hHandle jest ustawiany przy pomocy funkcji FindWindow podczas wywołania procedury WINAPI DllEntryPoint
czemu w kodzie podanym powyżej gdy szukane okno jest widoczne (niekoniecznie aktywne) funkcja if(hHandle) zwraca true, a gdy jest ono zminimalizowane zwraca false, czy da się to jakoś ominąć - zależałoby mi żeby okno zostało przywrócone i zareagowało na komunikat MYMESSAGE

Dziękuję za wszelką pomoc
Daniel

Pozostało 580 znaków

2004-09-26 12:55
0

Nie baw się w hooki - są prostsze sposoby - WinAPI

if(GetKeyState(VK_INSERT))
Caption = "Wciśnięto insert ";

albo

if(HIWORD(GetKeyState(VK_INSERT)) != 0)
Caption = "Insert wciśnięty";
else
Caption = "Inset w górze !";

oczywiście w Timerze
i po sprawie ...
:)


If God give me source code, i can change the world

Pozostało 580 znaków

2004-09-26 23:17
0

Może to jest łatwiejsze, ale mi chodzi aby, program reagował na naciśnięcie tego klawisza nawet jeśli będzie zminimalizowany, a właściwie głównie w takim przypadku. A tu on przestaje reagować już w momencie gdy aplikacje nie jest aktywna (chyba, że źle coś robię)
Dokładnie chodzi mi aby moja aplikacja (zminimalizowana) "nasłuchiwała" i po naciśnięciu określonej kombinacji klawiszy odpowiednio zareagowała, tzn aby zrobiła zrzut aktualnego ekranu, następnie została przywrócona i wkleiła go do Image1
No i przydało by się aby proces nasłuchiwania nie był za bardzo odczuwalny dla słabszych komputerów.


Daniel

Pozostało 580 znaków

2004-09-26 23:19
0

Jesli program ma reagowac na dana kombinacje to uzyj RegisterHotKey()

Pozostało 580 znaków

2004-09-27 09:52
0

Jesli program ma reagowac na dana kombinacje to uzyj RegisterHotKey()

A czy mógłbym prosić o jakiś przykład użycia tej funkcji ?


Daniel

Pozostało 580 znaków

2004-09-27 10:12
0

nie wiem czemu wykonuje sie dwa razy, ale wiem jak to rozwiazac

w globalnym zasiegu wstaw zmienna int licznik=0, w kodzie wstaw warunek
if(licznik % 2 ==0) - jesli reszta z dzielenia licznika to 0, to wykonuj, a na koncu funkcji
licznik++, dzieki temu funkcja wykona sie tylko raz;


Pozostało 580 znaków

2004-09-27 12:57
0

Jesli program ma reagowac na dana kombinacje to uzyj RegisterHotKey()

A czy mógłbym prosić o jakiś przykład użycia tej funkcji ?

Sadzac po kodzie, ktory napisales wczesniej wynika, ze uzywasz Buildera wiec, to bedzie, tak: w OnCreate dajesz np.

RegisterHotKey(Handle, 316, MOD_ALT | MOD_CONTROL, VK_F3) 

i jesli to zwroci wartosc rozna od zera to wszystko sie udalo i teraz okno bedzie dostawalo komunikat WM_HOTKEY gdy zostana nacisniete Alt + Ctrl + F3. Jeszcze w OnClose trzeba wyrejestrowac, czyli: UnregisterHotKey(Handle, 316)


 , to 316 to identyfikator, moze byc dowolna liczba. Teraz tylko dodac funkcje dla WM_HOTKEY, a jak to zrobic to znajdziesz w pomocy pod haslem: message handlers. I jeszcze taka uwaga, jako WPARAM przekazywany jest identyfikator i nalezaloby sprawdzic czy jest poprawny. To wszystko, jesli cos sie nie podoba to Help->Windows SDK.

Pozostało 580 znaków

2004-09-27 16:40
0

A może zapodałby ktoś to w assemblerze....??

Pozostało 580 znaków

2004-09-28 10:14
0

Z mojej strony to już wszystko - Dziękuję wszystkim za pomoc
RegisterHotKey - działa tak jak mi potrzeba, bez żabnych dziwnych zgrzytów.


Daniel

Pozostało 580 znaków

2004-09-28 17:07
0

Dokładnie chodzi mi o to, że po naciśnięciu INSERT pojawia mi się dwukrotnie komunikat z ShowMessage.

Po prostu komunikat wyskakuje dla zdarzenia OnKeyDown jak i OnKeyUp...


Pozostało 580 znaków

2004-10-01 12:59
0

Tylko, że obydwa komunikaty pojawiają się , zanim puszczę

Tylko, że obydwa komunikaty pojawiają się , zanim puszczę klawisz.


Daniel

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0