[BCB] 使用PostMessage達成後台自動按鍵

研究了BCB好一陣子,雖然常常偷懶,進展想當然爾也不會太多,不過在BCB中讀取Address、Pointer或者使用PostMessage、SendMessage真的比Visual Basic簡單太多了,完全省去了冗長宣告及自訂函數的麻煩,從FindWindow找到Hwnd到使用PostMessage發送按鍵指令,竟然只需要三行程式碼!


程式碼:

HWND hwnd; //宣告一個窗體名為hwnd
hwnd = FindWindow(NULL,L"未命名 - 記事本"); //賦予此hwnd為一個指定的視窗
PostMessage(hwnd, WM_KEYDOWN, 49, 0); //對該視窗發送按鍵指令,參數見下方

首先我們必須先一步了解Hwnd究竟是什麼,才比較能明白上面的程式碼代表了些什麼。

hwnd(Handle of Window),其中的h代表著句柄(handle),Wnd為一個變量,代表著某一個任意視窗。而hwnd則可以視為控制一個視窗必須的代碼。每一個視窗啟動時都會由Windows配給一個hwnd,若取得了它,可以進一步開啟進程、顯示隱藏的視窗或甚至關閉指定的視窗。

而PostMessage的參數有四個,比較重要的應該就是前面三項,其中「WM_KEYDOWN」亦可改為「WM_KEYUP」,是為放開該按鍵。

另外也有許多PostMessage的不同用法如下:

【鍵盤模擬動作】

1. 使用 PostMessage API (限制為必須要指定Handle)
觸發Tab按鍵按下事件:
PostMessage(hwnd, WM_KEYDOWN, VK_TAB, 0);
觸發Enter按鍵按下事件:
PostMessage(hwnd, WM_KEYDOWN, VK_RETURN, 0);
觸發Enter按鍵放開事件:
PostMessage(hwnd, WM_KEYUP, VK_F1, 0);
觸發 1 按鍵按下事件:
PostMessage(hwnd, WM_KEYDOWN, 49, 0);
觸發 A 按鍵按下事件:
PostMessage(hwnd, WM_KEYDOWN, 65, 0);

2. 使用 keybd_event api
按下 tab 鍵:
keybd_event(VK_TAB, 0, 0, 0);

【滑鼠模擬動作】

1. 使用 PostMessage API
PostMessage(hwnd, WM_LBUTTONDOWN, 0, 0);

2. 使用 mouse_event API
模擬滑鼠按左鍵:
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

模擬滑鼠按Double Click:
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

模擬滑鼠按右鍵:
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);