向其他程序發送模擬按鍵:
1、用keybd_event:
var
h : THandle;
begin
h :=
FindWindow('TFitForm', '1stOpt -
[Untitled1]');
SetForegroundWindow(h);
keybd_event(VK_CONTROL,
MapVirtualKey(VK_CONTROL, 0), 0, 0);
keybd_event(VK_F9, MapVirtualKey(VK_F9,
0), 0, 0);
keybd_event(VK_F9, MapVirtualKey(VK_F9, 0), KEYEVENTF_KEYUP,
0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP,
0);
end;
選找到目標程序的句柄h,在應用Keybd_event之前必須先把目標程序設為當前活動窗口。(如果不想看見的話,把目標程序的位置用SetWindowLong設置在屏幕之外.)
2、用SendMessage、PostMessage:不需目標置為最前。
SendMessage(h,WM_KEYDOWN,VK_F9,0);
PostMessage(h,WM_KEYDOWN,VK_F9,0);
發送組合鍵:PostMessage(h,WM_SYSKEYDOWN,VK_F9,$10000000);//試驗不成功
Ctrl
: $10000000;
Shift: $08000000;
Alt:
$20000000
如打開菜單ALT-F,則要WM_SYSKEYDOWM,:PostMessage(h,WM_SYSKEYDOWN,70,$20000000);才行。(//試驗成功)
3、CTL鍵組合發送不成功。
4、向后台應用程序發送按鍵總結:
4.1
單個按健:PostMessage(h,WM_KEYDOWN,VK_F9,0);
4.2ALT+按鍵:PostMessage(h,WM_SYSKEYDOWN,70,$20000000);
4.3CTL+按鍵:暫時模仿如下,基本可行。但不用sleep(10),有時行,有時不行。換用SendMessage卻不行,WHY?
if
hwnd<>0
then
begin
keybd_event(VK_CONTROL,0,0,0);
PostMessage(hwnd,WM_KEYDOWN,VK_F9,0);
PostMessage(hwnd,WM_KEYUP,VK_F9,0);
sleep(10);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
end;
說明:
鍵盤事件消息可以分為“擊鍵”和“字符”兩類。對於可以顯示字符的擊鍵組合,Windows不僅向程序發送擊鍵消息,還發送字符消息。有些鍵不產生字符,這些鍵包括shift鍵、Fn功能鍵、光標移動鍵和特殊字符如Insert和Delete。
擊鍵消息包括WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP四種類型。WM_KEYDOWN和WM_KEYUP消息通常是在按下或釋放不帶Alt鍵的鍵時產生;WM_SYSKEYDOWN和WM_SYSKEYUP消息通常由與Alt組合的擊鍵產生,這些鍵激活程序菜單或系統菜單上的選項,或切換活動窗口,也可以用作系統菜單加速鍵。由於Windows處理所有Alt鍵的功能,應用程序無需捕獲這些消息。對於4類擊鍵消息,wParam是虛擬鍵代碼,代表按下或釋放的鍵,而lParam包含擊鍵的其他數據。如果按住一個鍵不放使得自動重復功能生效,那么該鍵最后被釋放時,Windows會給窗口過程發送一系列的WM_KEYDOWN(或WM_SYSKEYDWON)消息和一個WM_KEYUP(或WM_SYSKEYUP)消息。