FindWindow和SendMessage解决进程通信
2011-12-24 17:59
881 查看
在做一个监控项目,简单点来说就是A.exe是一个主程序,但有时不知道它会在怎样的一个状态,所以有一个B.exe来对其进行实时监控,获得各项运行状态。试了几种进程通信的方法,觉得有一种真是简单又实用,就是利用FindWindow和SendMessage,特此记下。
首先说FindWindow。
FindWindow返回与指定字符创相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄。函数原型为:
C++:
HWND FindWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName );
lpClassName就是窗口类名,大多数情况不会用到它。lpWindowName是窗口名,就是窗口标题,任何一个窗口都有标题,当然也会有相同标题的,那只会找到在z-order最上层的窗口。
再看SendMessage,稍微复杂一点,它是通信的主力军。
SendMessage将指定的消息发送到一个或多个窗口。函数原型为:
C++:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
hWnd是接收消息的窗口的句柄。Msg是将被发送的消息。wParam和IParam都是指定附加的消息信息。
这里仅仅介绍怎样利用它们实现进程通信,其实都还有很多功能,不再详述。
要用SendMessage需要知道窗口句柄,这个当然是通过FindWindow,还需要知道是什么消息,在这里用的是0x004A,一般变量命名为WM_COPYDATA,还有就是所要发送的消息信息了,就是具体内容,就需要一个特定的结构COPYDATASTRUCT,原型为:
C++:
struct COPYDATASTRUCT {ULONG_PTR dwData;DWORD cbData;PVOID lpData;}
好了这样就可以发送消息到另一个窗口上,代码如下:
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));
}
}
发送完了,那接收窗口就要接收了,怎样接收呢,也很简单还是根据消息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);
}
很简单吧,代码不多,应该很容易看懂。
首先说FindWindow。
FindWindow返回与指定字符创相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄。函数原型为:
C++:
HWND FindWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName );
lpClassName就是窗口类名,大多数情况不会用到它。lpWindowName是窗口名,就是窗口标题,任何一个窗口都有标题,当然也会有相同标题的,那只会找到在z-order最上层的窗口。
再看SendMessage,稍微复杂一点,它是通信的主力军。
SendMessage将指定的消息发送到一个或多个窗口。函数原型为:
C++:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
hWnd是接收消息的窗口的句柄。Msg是将被发送的消息。wParam和IParam都是指定附加的消息信息。
这里仅仅介绍怎样利用它们实现进程通信,其实都还有很多功能,不再详述。
要用SendMessage需要知道窗口句柄,这个当然是通过FindWindow,还需要知道是什么消息,在这里用的是0x004A,一般变量命名为WM_COPYDATA,还有就是所要发送的消息信息了,就是具体内容,就需要一个特定的结构COPYDATASTRUCT,原型为:
C++:
struct COPYDATASTRUCT {ULONG_PTR dwData;DWORD cbData;PVOID lpData;}
好了这样就可以发送消息到另一个窗口上,代码如下:
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));
}
}
发送完了,那接收窗口就要接收了,怎样接收呢,也很简单还是根据消息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);
}
很简单吧,代码不多,应该很容易看懂。
相关文章推荐
- API - FindWindow和SendMessage解决进程通信
- API - FindWindow和SendMessage解决进程通信
- C++ SendMessage()乱码问题解决
- vb利用FindWindow,GetWindowText,SendMessage查找程序并发送最小化消息
- C++ 随笔 知识点 Sendmessage,FindWindow,keybd_event
- 工作线程调用sendmessage()向主对话框发送自定义消息遇到的问题以及解决
- FindWindow, FindWindowEx, SendMessage, SetForegroundWindow 使用
- vb利用FindWindow,GetWindowText,SendMessage查找程序并发送最小化消息
- vc++里调用SendMessage()提示afxwin2.inl Line 588的断言错误的解决方法
- C#关于外挂汉化的一些思考(API函数FindWindow,FindWindowEx,SendMessage)(转)
- 调用SendMessage 产生死锁的解决方法
- Linux启动时"在设置KDE的进程通信时发生了错误"解决办法
- NSIS 使用SendMessage环境变量不能立即生效解决办法(进程中无效)
- SendMessage和Findwindow用法
- FindWindow与SendMessage传送消息
- FindWindow使用技巧;解决FindWindow的lpClassName获取不到句柄
- vc++里调用SendMessage()提示afxwin2.inl Line 588的断言错误的解决方法
- 【史上最简单】解决有些网页不能被复制
- mysql的table is read only 解决方法
- (转)jdbc 调用 sql server 的存储过程时“该语句没有返回结果集”的解决方法