有時候我們想要通過發送訊息的方式控制其他進程,一般用到的知識點記錄如下:
1. 尋找視窗 可以用spy++工具觀察視窗的結構層次
1)HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
用此函數來尋找頂層視窗,但是不能用此函數來找子視窗。返回的是視窗的控制代碼
2)HWND FindWindowEx(
HWND hwndParent, // handle to parent window
HWND hwndChildAfter, // handle to a child window
LPCTSTR lpszClass, // pointer to class name
LPCTSTR lpszWindow // pointer to window name
);
用此函數既可以尋找頂層視窗也可以尋找子視窗。第一個參數是要尋找視窗的父視窗的控制代碼,如果要尋找的是頂層視窗則將其置為NULL,第二個參數是表示從哪個視窗之後開始尋找,如果為NULL,則是從該父視窗的第一個子視窗開始尋找。第三個參數標示的是要尋找視窗的類名,最後一個參數標示的是要尋找視窗的視窗標題。
有時候運用此函數一些子視窗尋找不到不知道什麼原因,此時可以將父視窗的子視窗以及後代用遞迴的方式枚舉出來,然後判斷是否是自己要找的視窗。
枚舉視窗主要用到的函數為GetWindow。
2. 對菜單發送訊息
對菜單發送的訊息類型均為WM_COMMAND,可以通過spy++工具撲捉訊息迴圈,然後查看要發送訊息的wParam,以及lParam值。然後用SendMessage或者PostMessage函數發送訊息。這兩函數的區別是SendMessage函數發送訊息以後一直等到訊息處理完成之後返回,而PostMessage函數將訊息發送出去之後不管訊息是否被處理都立即返回。對按鈕發送點擊訊息和對菜單發送訊息差不多,都是用WM_COMMAND。
3. 對樹形控制項發送訊息
void CSendmessageDlg::SendMessageToTreeCtrl(HWND hTree)
{
if (!hTree)
{
return;
}
//發訊息得到樹的根節點
HTREEITEM hItem = (HTREEITEM)::SendMessage(hTree,TVM_GETNEXTITEM,
TVGN_ROOT, 0x0);
if (hItem)
{
//發送訊息展開根節點
::SendMessage(hTree, TVM_EXPAND, TVE_EXPAND,(long)hItem);
//發送訊息選中下一個可見的節點
hItem = (HTREEITEM)::SendMessage(hTree, TVM_GETNEXTITEM,
TVGN_NEXTVISIBLE, (long)hItem);
if (hItem)
{
::SendMessage(hTree, TVM_SELECTITEM, TVGN_CARET, (long)hItem);
}
}
}