建立两个项目分别命名为App1和App2,在App1中新建一个窗体Form1,将Form1的Text属性值由"Form1"改为"测试窗口".

在App1的Form1拖入一个文本框.其Text属性值为"获取消息".在App1的Form1中拖入一个按钮.其Text属性值为"按钮"

在按钮的事件中写入如下代码:MessageBox.Show("App1.Form1中的按钮被点击");

在App2中新建一个窗体Form1,在App2的窗体Form1中拖入两个按钮btn1,btn2,在btn1的事件中写入如下代码:

 1private void btn1_Click(object sender, EventArgs e)
 2        {
 3            IntPtr hwnd_win;
 4            IntPtr hwnd_button;
 5
 6            hwnd_win = FindWindow(null"测试窗口");
 7            hwnd_button = FindWindowEx(hwnd_win, new IntPtr(0), null"按钮");
 8            MessageBox.Show(hwnd_win.ToString());
 9            const int BM_CLICK = 0x00F5;
10            Message msg = Message.Create(hwnd_button, BM_CLICK, new IntPtr(0), new IntPtr(0));
11            PostMessage(msg.HWnd, msg.Msg, msg.WParam, msg.LParam); 
12        }

在btn2的事件中写入如下代码:

 1         private void btn2_Click(object sender, EventArgs e)
 2         {
 3             const int WM_CHAR = 0x0102;
 4           IntPtr hwnd_win ;
 5           IntPtr hwnd_textbox ;
 6 
 7           hwnd_win = FindWindow(null"测试窗口");
 8           hwnd_textbox = FindWindowEx(hwnd_win, new IntPtr(0), null"获取消息"); 
 9   
10           string strtext = "从App2发送的消息";
11           UnicodeEncoding encode = new UnicodeEncoding();
12           char[] chars = encode.GetChars(encode.GetBytes(strtext));
13           Message msg ;
14             foreach (char c in chars)
15            {
16               msg = Message.Create(hwnd_textbox, WM_CHAR, new IntPtr(c), new IntPtr(0));
17               PostMessage(msg.HWnd, msg.Msg, msg.WParam, msg.LParam);
18 
19             }
20         }

 

App2.Form1.cs中引入:using System.Runtime.InteropServices;

1 [DllImport("user32.dll")]
2         public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
3 
4         [DllImport("user32.dll")]
5         public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
6 
7         [DllImport("user32.dll", CharSet = CharSet.Unicode)]
8         public static extern IntPtr PostMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

 

先运行项目App1,在运行项目App2. 在App2的窗体Form1中点击btn1,App1的窗体Form1的按钮被触发.弹出"App1.Form1中的按钮被点击",在App2的窗体Form1中点击btn2,App1的窗体Form1的文本框中则会显示"从App2发送的消息"

 

函数原型

 

findwindow

  FindWindow,Win32 API函数。
  FindWindow函数返回与指定字符创相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄。这个函数不会查找子窗口。
  函数原型:
  HWND FindWindow
  (
  LPCSTR lpClassName,
  LPCSTR lpWindowName
  );
  参数表:
  lpClassName
  指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。
  lpWindowName
  指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。
  返回值:
  如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
  如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。
  快捷信息:
  导入库:user32.lib
  头文件:winuser.h
  ***.Net 中运用
  命名空间 using System.Runtime.InteropServices;
  导入库 [DllImport("user32.dll")]
  函数原型 public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  参数说明 lpClassName String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类
  lpWindowName String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收 任何窗口标题
  返回值 :句柄
 

FindWindowEx

  函数功能:该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
  函数原型:HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);
  参数;
  hwndParent:要查找子窗口的父窗口句柄。
  如果hwndParent为NULL,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。
  Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。
  hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。
  lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。
  lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。
  若想获得更多错误信息,请调用GetLastError函数。
  速查 NT:4.0对以上版本;Windows:95以上版本;Windows CE:不支持;头文件:winuser.h;库文件:user32.lib;Unicode:在Windows NT上实现为Unicode和ANSI两种版本。
  在窗口列表中寻找与指定条件相符的第一个子窗口
  返回值
  Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
  参数表
  参数 类型及说明
  hWnd1 Long,在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找)
  hWnd2 Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
  lpsz1 String,欲搜索的类名。零表示忽略
  lpsz2 String,欲搜索的类名。零表示忽略

PostMessage

  函数功能:该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回。消息队列里的消息通过调用GetMessage和PeekMessage取得。
  函数原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
  参数
  hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
  HWND.BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口。
  NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样。
  Msg:指定被寄送的消息。
  wParam:指定附加的消息特定的信息。
  IParam:指定附加的消息特定的信息。
  返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。
  备注:需要以 HWND_BROADCAST方式通信的应用程序应当用函数 RegisterwindwosMessage来获得应用程序间通信的独特的消息。
  如果发送一个低于WM_USER范围的消息给异步消息函数(PostMessage.SendNotifyMessage,SendMesssgeCallback),消息参数不能包含指针。否则,操作将会失败。函数将再接收线程处理消息之前返回,发送者将在内存被使用之前释放。
  速查:Windows NT: 3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。
  P.S. 为什么 “如果发送一个低于WM_USER范围的消息给异步消息函数(PostMessage.SendNotifyMessage,SendMesssgeCallback),消息参数不能包含指针。否则,操作将会失败。

posted on 2009-05-06 10:41  arong.NET  阅读(2147)  评论(0编辑  收藏  举报