API - FindWindow和SendMessage解决进程通信
2009-01-18 14:21
309 查看
在做一个监控项目,简单点来说就是A.exe是一个主程序,但有时不知道它会在怎样的一个状态,所以有一个B.exe来对其进行实时监控,获得各项运行状态。试了几种进程通信的方法,觉得有一种真是简单又实用,就是利用FindWindow和SendMessage,特此记下。
首先说FindWindow。
FindWindow返回与指定字符创相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄。函数原型为:
C++:
HWND FindWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName );
C#:
[DllImport("User32.dll", EntryPoint = "FindWindow")]
int FindWindow(string lpClassName, string lpWindowName);
lpClassName就是窗口类名,大多数情况不会用到它。lpWindowName是窗口名,就是窗口标题,任何一个窗口都有标题,当然也会有相同标题的,那只会找到在z-order最上层的窗口。
再看SendMessage,稍微复杂一点,它是通信的主力军。
SendMessage将指定的消息发送到一个或多个窗口。函数原型为:
C++:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
C#:
[DllImport("User32.dll", EntryPoint = "SendMessage")]
int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);
hWnd是接收消息的窗口的句柄。Msg是将被发送的消息。wParam和IParam都是指定附加的消息信息。
这里仅仅介绍怎样利用它们实现进程通信,其实都还有很多功能,不再详述。
要用SendMessage需要知道窗口句柄,这个当然是通过FindWindow,还需要知道是什么消息,在这里用的是0x004A,一般变量命名为WM_COPYDATA,还有就是所要发送的消息信息了,就是具体内容,就需要一个特定的结构COPYDATASTRUCT,原型为:
C++:
struct COPYDATASTRUCT {ULONG_PTR dwData;DWORD cbData;PVOID lpData;}
C#:
struct COPYDATASTRUCT{IntPtr dwData;public int cbData;[MarshalAs(UnmanagedType.LPStr)]public string lpData;}
好了这样就可以发送消息到另一个窗口上,代码如下:
C++:
void SendFormMessage(LPCTSTR formText, PVOID msg)
void sendFormMessage(string formText, string message)
LONG WINAPI AppWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)//重载窗口消息
protected override void DefWndProc(ref System.Windows.Forms.Message m)//重载窗口消息
很简单吧,代码不多,应该很容易看懂。
首先说FindWindow。
FindWindow返回与指定字符创相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄。函数原型为:
C++:
HWND FindWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName );
C#:
[DllImport("User32.dll", EntryPoint = "FindWindow")]
int FindWindow(string lpClassName, string lpWindowName);
lpClassName就是窗口类名,大多数情况不会用到它。lpWindowName是窗口名,就是窗口标题,任何一个窗口都有标题,当然也会有相同标题的,那只会找到在z-order最上层的窗口。
再看SendMessage,稍微复杂一点,它是通信的主力军。
SendMessage将指定的消息发送到一个或多个窗口。函数原型为:
C++:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
C#:
[DllImport("User32.dll", EntryPoint = "SendMessage")]
int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);
hWnd是接收消息的窗口的句柄。Msg是将被发送的消息。wParam和IParam都是指定附加的消息信息。
这里仅仅介绍怎样利用它们实现进程通信,其实都还有很多功能,不再详述。
要用SendMessage需要知道窗口句柄,这个当然是通过FindWindow,还需要知道是什么消息,在这里用的是0x004A,一般变量命名为WM_COPYDATA,还有就是所要发送的消息信息了,就是具体内容,就需要一个特定的结构COPYDATASTRUCT,原型为:
C++:
struct COPYDATASTRUCT {ULONG_PTR dwData;DWORD cbData;PVOID lpData;}
C#:
struct COPYDATASTRUCT{IntPtr dwData;public int cbData;[MarshalAs(UnmanagedType.LPStr)]public string lpData;}
好了这样就可以发送消息到另一个窗口上,代码如下:
C++:
void SendFormMessage(LPCTSTR formText, PVOID msg)
void sendFormMessage(string formText, string message)
LONG WINAPI AppWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)//重载窗口消息
protected override void DefWndProc(ref System.Windows.Forms.Message m)//重载窗口消息
很简单吧,代码不多,应该很容易看懂。
相关文章推荐
- API - FindWindow和SendMessage解决进程通信
- FindWindow和SendMessage解决进程通信
- android手机安装时缺少google map api 的解决方法
- C#用 SendKyes 结合 Process 或 API FindWindow、SendMessage(PostMessage) 等控制外部程序[转]
- 使用 man -k 有时查不到相关 api 解决办法
- Google Maps API申请 之 Android Maps API (2012-5-15新发布可解决网页打不开的问题)
- Eclipse Src library中丢失Apache servlet-api 解决办法
- 导入工程后出现“注: 某些输入文件使用或覆盖了已过时的 API”的一种解决办法
- [ASP.NET 5]终于解决:Unable to load DLL 'api-ms-win-core-localization-obsolete-l1-2-0.dll'
- intellij idea 出现“Usage of API documented as @since 1.8+”的解决办法
- There was an internal API error.的解决办法
- 淘宝API图片尺寸的缩略图解决办法
- 使用WaveOut API播放WAV音频文件(解决卡顿)
- 关于丢失 api-ms-win-crt-runtimel1-1-0.dll的解决方法
- androidStudio开发过程中minSdk(API 26) > deviceSdk(API 19)解决办法
- Application does not specify an API level requirement 错误的解决办法!
- Windows API SendMessage 和 PostMessage 内部实现
- android API not find解决思路
- Androidn Notification在新API中的使用(解决找不到setLatestEventInfo方法)
- Thinkphp 解决api开发中异常返回依然是html的问题