2009-01-30 61 views
2

我正在尝试更改我的键盘发送给应用程序的键。我已经创建了一个全局钩子,可以阻止我想要的密钥,但是我现在想要发送一个新的密钥。这里是我的钩PROC:如何模拟按键到当前聚焦的窗口?

LRESULT __declspec (dllexport) HookProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    int ret; 

    if(nCode < 0) 
    { 
     return CallNextHookEx(hHook, nCode, wParam, lParam); 
    } 

    kbStruct = (KBDLLHOOKSTRUCT*)lParam; 

    printf("\nCaught [%x]", kbStruct->vkCode); 

    if(kbStruct->vkCode == VK_OEM_MINUS) 
    { 
     printf(" - oem minus!"); 
     keybd_event(VK_DOWN, 72, KEYEVENTF_KEYUP, NULL); 
     return -1; 
    } 
    else if(kbStruct->vkCode == VK_OEM_PLUS) 
    { 
     printf(" - oem plus!"); 
     keybd_event(VK_UP, 75, KEYEVENTF_KEYUP, NULL); 
     return -1; 
    } 

    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

我使用的SendMessage和PostMessage的与GetFocus()和GetForegroudWindow()尝试过,但无法弄清楚如何创建WM_KEYUP或WM_KEYDOWN的LPARAM。我也尝试了keybd_event(),它可以模拟键(我知道,因为这个钩子程序捕获了模拟按键),包括5或6个不同的扫描代码,但是没有影响我的前景窗口。

我基本上试图把我的ms3200上的缩放栏变成滚动控件,所以我甚至可能会发送错误的按键(向上和向下)。

回答

2

调用keybd_event是正确的。如果你所做的只是一个关键,那么也许该窗口会处理关键信息。你真的需要通过一键发送往下依次关键了:

keybd_event(VK_UP, 75, 0, NULL); 
keybd_event(VK_UP, 75, KEYEVENTF_KEYUP, NULL); 

或者,更好的是,发送键按下时,OEM密钥下降和键起来的时候OEM密钥上升。您可以通过kbStruct-> flags & LLKHF_UP来告诉down/up状态。

0

您可能想尝试Control-UpArrow和Control-DownArrow而不是Up和Down。然而,这似乎并不适用于所有应用程序,即使在应用程序可以工作的情况下,也可能取决于重点在哪里。