SendMessage WM_KEYDOWN并不总是有效

时间:2013-07-22 06:24:03

标签: c++ delphi winapi

我正在尝试制作一个程序,将一些按键发送到某个游戏的窗口。如果你喜欢的机器人。我正在使用SendMessage / PostMessage WM_KEYDOWN和WM_KEYUP以及适当的lParam到该窗口。我尝试过的另一种方法是使用SendInput。并使用SetKeyboardState发送/发布。

问题在于所有方法都以相同的方式工作 - 并非总是如此。我的意思是我试图使用计时器每隔10秒将VK_F9发送到该窗口。它可以工作3次,或5次,或零次。这意味着在随机发送或发布后它停止工作。但是,如果我按下键盘上的F9,则下一次发送有效!

那里有什么问题?可能有一些我不知道的状态?

提前致谢!

在C ++中我试过这个:

void GenerateKey(int vk, BOOL bExtended) {

KEYBDINPUT  kb = {0};
INPUT       Input = {0};

/* Generate a "key down" */
if (bExtended) { kb.dwFlags  = KEYEVENTF_EXTENDEDKEY; }
kb.wVk  = vk;
Input.type  = INPUT_KEYBOARD;
Input.ki  = kb;
SendInput(1, &Input, sizeof(Input));
Sleep(300);

/* Generate a "key up" */
ZeroMemory(&kb, sizeof(KEYBDINPUT));
ZeroMemory(&Input, sizeof(INPUT));
kb.dwFlags  =  KEYEVENTF_KEYUP;
if (bExtended) { kb.dwFlags |= KEYEVENTF_EXTENDEDKEY; }
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
SendInput(1, &Input, sizeof(Input));

return;
}

在Delphi中我使用了这个:

procedure FKey(Win:THandle; key:integer; special: boolean);
var
lParam: LongInt;
begin
 lParam := MakeLong(0, MapVirtualKey(key, 0));
 if (special) then
    lParam:=lParam or $1000000;
 SendMessage(Win,WM_KEYDOWN,key,lParam);
 SendMessage(Win,WM_KEYUP,key,$C0000000);
end;

P.S。:可能是一个线索 - 带有宏的Logitech X7鼠标工作正常。

0 个答案:

没有答案