在DLL中,用SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc, HInstance, 0);
做了一个全局钩子,另一个TForm里的消息处理函数wmKey()接收 KeyboardHookProc() postMessage 来的键盘消息,如果在TForm里按键,程序就会不停的在wmKey()里循环,只有结束任务。而在其它地方的按键是正常的。
如果KeyboardHookProc()改用sendMessage发消息,wmKey()倒是不会死循环了,但是退出程序后,刚才被捕捉按键的窗体就死锁了。
做了一个全局钩子,另一个TForm里的消息处理函数wmKey()接收 KeyboardHookProc() postMessage 来的键盘消息,如果在TForm里按键,程序就会不停的在wmKey()里循环,只有结束任务。而在其它地方的按键是正常的。
如果KeyboardHookProc()改用sendMessage发消息,wmKey()倒是不会死循环了,但是退出程序后,刚才被捕捉按键的窗体就死锁了。
begin
if iCode<0 then begin
Result:=CallNextHookEx(khook, iCode, wParam, lParam);
exit;
end; pMapMem^.KeyCode := wParam;
if lParam>0 then
pMapMem^.MsgID:=pMapMem^.wmKeyDown
else
pMapMem^.MsgID:=pMapMem^.wmKeyUp;
result := 0;
//这样写的话,程序退出,被捕捉的程序就死了,但也不是每次都死
sendMessage(pMapMem^.Handle, pMapMem^.MsgID, wParam, 0); end;
//如果这样,主界面一旦有按键,就死循环了
postMessage(pMapMem^.Handle, pMapMem^.MsgID, wParam, 0); end;
///////////////////////////////////////////////////////////////////////////////////////////////procedure TForm1.wmKeyDown(var msg: TMessage);
begin
memo1.lines.add(Char(msg.WParam));
end;///////////////////////////////////////////////////////////////////////////////////////////////
begin
if iCode<0 then begin
Result:=CallNextHookEx(khook, iCode, wParam, lParam);
exit;
end; pMapMem^.KeyCode := wParam;
if lParam>0 then
pMapMem^.MsgID:=pMapMem^.wmKeyDown
else
pMapMem^.MsgID:=pMapMem^.wmKeyUp;
result := 0;
//这样写的话,程序退出,被捕捉的程序就死了,但也不是每次都死
sendMessage(pMapMem^.Handle, pMapMem^.MsgID, wParam, 0); end;
//如果这样,主界面一旦有按键,就死循环了
postMessage(pMapMem^.Handle, pMapMem^.MsgID, wParam, 0); end;
///////////////////////////////////////////////////////////////////////////////////////////////procedure TForm1.wmKeyDown(var msg: TMessage);
begin
memo1.lines.add(Char(msg.WParam));
end;///////////////////////////////////////////////////////////////////////////////////////////////