利用FindWindow和SendMessage进程通信
利用FindWindow和SendMessage,特此記下。
?????首先說FindWindow。
?????FindWindow返回與指定字符創(chuàng)相匹配的窗口類名或窗口名的最頂層窗口的窗口句柄。函數(shù)原型為:
?????C++:
?????HWND FindWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName );
?????lpClassName就是窗口類名,大多數(shù)情況不會(huì)用到它。lpWindowName是窗口名,就是窗口標(biāo)題,任何一個(gè)窗口都有標(biāo)題,當(dāng)然也會(huì)有相同標(biāo)題的,那只會(huì)找到在z-order最上層的窗口。
?????
?????再看SendMessage,稍微復(fù)雜一點(diǎn),它是通信的主力軍。
?????SendMessage將指定的消息發(fā)送到一個(gè)或多個(gè)窗口。函數(shù)原型為:
?????C++:
?????LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
?????hWnd是接收消息的窗口的句柄。Msg是將被發(fā)送的消息。wParam和IParam都是指定附加的消息信息。
?????這里僅僅介紹怎樣利用它們實(shí)現(xiàn)進(jìn)程通信,其實(shí)都還有很多功能,不再詳述。
?????要用SendMessage需要知道窗口句柄,這個(gè)當(dāng)然是通過FindWindow,還需要知道是什么消息,在這里用的是0x004A,一般變量命名為WM_COPYDATA,還有就是所要發(fā)送的消息信息了,就是具體內(nèi)容,就需要一個(gè)特定的結(jié)構(gòu)COPYDATASTRUCT,原型為:
?????C++:
?????struct COPYDATASTRUCT {ULONG_PTR dwData;DWORD cbData;PVOID lpData;}
??????好了這樣就可以發(fā)送消息到另一個(gè)窗口上,代碼如下:
?????C++:
?????
Code
void?SendFormMessage(LPCTSTR?formText,?PVOID?msg)
{
????HWND?hwnd=FindWindow(NULL,formText);
????if(hwnd!=0)
?????{
????????COPYDATASTRUCT?cd;
????cd.dwData?=?100;
????cd.cbData?=?100;
????cd.lpData?=?msg;
????SendMessage(hwnd,?WM_COPYDATA,?0,?(LPARAM)(&cd));
????}
}
?????發(fā)送完了,那接收窗口就要接收了,怎樣接收呢,也很簡(jiǎn)單還是根據(jù)消息0x004A來獲得。代碼如下:
?????C++:
?????
Code
LONG?WINAPI??AppWndProc(HWND?hwnd,?UINT?msg,?WPARAM?wParam,?LPARAM?lParam)//重載窗口消息
{
????COPYDATASTRUCT*?pCopyDataStruct;
????char?buf[];
????switch(msg)
?????{
????case?WM_COPYDATA:
?????{
????????pCopyDataStruct?=?(COPYDATASTRUCT*)lParam;
????????memset(&buf,?0,?sizeof(buf));
????????memcpy(&buf,pCopyDataStruct->lpData,pCopyDataStruct->cbData);
????????if?(0?==?strcmp(buf,""))//在這里判斷就可以了
?????????{}
????????}
????????break;
????????
????}
????return?(LONG)?DefWindowProc(hwnd,msg,wParam,lParam);
}
總結(jié)
以上是生活随笔為你收集整理的利用FindWindow和SendMessage进程通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot:Actuator
- 下一篇: java 并发包之 LongAdder