delphi 向其他程序發送模擬按鍵


向其他程序發送模擬按鍵:

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)消息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM