[ Burgos @ 09.11.2004. 22:29 ] @
Zdravo, opet mi treba mala pomoć :)
Naime, uspeo sam da "upecam" tastere ALT-TAB i CTRL-ESC, ali mi treba pomoć kako da pozovem novu funkciju posle toga. Znači, treba mi neka funkcija pomoću koje ću posle uspešnog pecanja pozvati novu funkciju. Hvala
[ Burgos @ 10.11.2004. 09:19 ] @
Sorry, zaboravio sam source:
Code:


#define _WIN32_WINNT 0x0400
#include <Windows.h>
void OnTop();


LRESULT CALLBACK LowLevelKeyboardProc(int nCode, 
   WPARAM wParam, LPARAM lParam) {

   BOOL fEatKeystroke = FALSE;

   if (nCode == HC_ACTION) {
      switch (wParam) {
      case WM_KEYDOWN:  case WM_SYSKEYDOWN:
      case WM_KEYUP:    case WM_SYSKEYUP: 
         PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
         fEatKeystroke = 
            ((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
            ((p->vkCode == VK_ESCAPE) && 
            ((p->flags & LLKHF_ALTDOWN) != 0)) ||
            ((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 
             0x8000) != 0));
         break;
      }
   }
   return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, 
          lParam));
}




int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {


   HHOOK hhkLowLevelKybd  = SetWindowsHookEx(WH_KEYBOARD_LL, 
      LowLevelKeyboardProc, hinstExe, 0);


   MessageBox(NULL, 
      TEXT("System combination of keys is disabled.\n")
      TEXT("Click OK to terminate this application and enable combinations"),
      TEXT("Try to press ALT-TAB, CTRL-ESC or ALT-ESC!"), MB_OK);
   UnhookWindowsHookEx(hhkLowLevelKybd);

   return(0);
}

void OnTop()
{
      MessageBox(NULL, 
      TEXT("You have pressed forbiden combination!\n")
      TEXT("Click OK to close this message box"),
      TEXT("Forbiden!"), MB_OK);
}



Znaci sve sam pokusavao ali nikako da lepo pozovem OnTop() funkciju posle ALT-TAB, CTRL-ESC ili ALT-ESC
[ DarkMan @ 10.11.2004. 17:01 ] @
Probao sam tvoj kod i ubacio jednu liniju:
Code:

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, 
   WPARAM wParam, LPARAM lParam) {

   BOOL fEatKeystroke = FALSE;

   if (nCode == HC_ACTION) {
      switch (wParam) {
      case WM_KEYDOWN:  case WM_SYSKEYDOWN:
      case WM_KEYUP:    case WM_SYSKEYUP: 
         PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
         fEatKeystroke = 
            ((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
            ((p->vkCode == VK_ESCAPE) && 
            ((p->flags & LLKHF_ALTDOWN) != 0)) ||
            ((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 
             0x8000) != 0));
         break;
      }
   }
   if(fEatKeystroke) OnTop();
   return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, 
          lParam));
}

Ovo funkcionise, kada pritisnes te tvoje nedozvoljene kombinacije iskoci poruka.
[ Burgos @ 10.11.2004. 21:18 ] @
Da, to sam i ja provalio, ali mi se poruka pojavi 2 puta, i za to vreme ALT-TAB funkcioniše.
[ DarkMan @ 11.11.2004. 19:48 ] @
Ta funkcija LowLevelKeyboardProc je jedna u lancu sistemskih funkcija (sledece pozivas sa CallNextHookEx) koje obradjuju dogadjaje na pritisak tastera na tastaturi. Kao takva ona mora da bude kratka i brza.
Ti si kao za primer stavio da ona pozove messagebox koji u sustini zaustavi proceduru dok korisnik ne pritisne dugme OK na poruci. Sta se tacno desava dok je procedura zaustavljena, koliko puta se aktivira LowLevelKeyboardProc funkcija to sad zavisi od sistema. Mozda je i objasnjeno u MSDN-u, proveri.