如题。比如:如何在应用程序中取消POWER键的功能。
在键盘上按下POWER键能在系统之前处理它。

解决方案 »

  1.   

    #pragma data_seg (".mydata")
    HHOOK g_hHookKb=NULL; // hook #pragma data_seg ()
    #pragma comment(linker, "/SECTION:.mydata,RWS") // tell linker: make it shared
    LRESULT CALLBACK ShieldKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    if (nCode == HC_ACTION)
    {
    KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT *) lParam;
    BOOL bCtrlKeyDown = GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT)*8)-1);
    if ( pkh->vkCode==VK_RETURN ||
     pkh->vkCode==VK_F12 || 
     pkh->flags&LLKHF_ALTDOWN ||
    pkh->vkCode==VK_ESCAPE ||
    (pkh->vkCode==VK_ESCAPE && bCtrlKeyDown) ||     // Ctrl+Esc
    (pkh->vkCode==VK_TAB && pkh->flags&LLKHF_ALTDOWN) ||   // Alt+TAB
    (pkh->vkCode==VK_ESCAPE && pkh->flags&LLKHF_ALTDOWN) || // Alt+Esc
    (pkh->vkCode==VK_F4 && pkh->flags&LLKHF_ALTDOWN) ||
    (pkh->vkCode=='F' && pkh->flags&LLKHF_ALTDOWN) ||
    (pkh->vkCode==VK_LWIN || pkh->vkCode==VK_RWIN)) // Start Menu

    //if ((wParam==WM_SYSKEYDOWN || wParam==WM_KEYDOWN))
    // MessageBeep(0); // only beep on downstroke if requested return 1; // gobble it: go directly to jail, do not pass go
    }

    } return CallNextHookEx(g_hHookKb, nCode, wParam, lParam);
    }BOOL __stdcall ShieldMK()
    {
    g_hHookKb = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)ShieldKeyboardProc, MyDll.m_hInstance, 0); return (g_hHookKb!=NULL? TRUE:FALSE);
    }遗憾的是,没有帮你找到power键的虚键值.据说,该键的事件直接在系统级被处理掉了, 没有
    发出消息的至窗口消息队列的. 只是听说而异,你可以再研究, 具体钩子就是上边写的了.
      

  2.   

    意外地发现:
    #define WM_POWER                   0x0048也就是说可以将上面的判断条件改为:
    if (pkh->vkCode==VK_POWER){......} 就ok了