[BCB6] Hook Klawiatury

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

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 ...
:)

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.

0

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

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 ?

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;

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.
0

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

0

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

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...

0

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

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

0

Aha, bo hook wywołuje zdarzenie onKeyDown co 0,5 sekundy chyba, dopóki klawisz jest wciśnięty. Ale tego się łatwo pozbyć...

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