C#中使用SendMessage

在C#中,程序采用了的驱动采用了事件驱动而不是原来的消息驱动,虽然.net框架提供的事件已经十分丰富,但是在以前的系统中定义了丰富的消息对系统的编程提供了方便的实现方法,因此在C#中使用消息有时候还是大大提高编程的效率的。  1 定义消息 在c#中消息需要定义成windows系统中的原始的16进制数字,比如 const int WM_Lbutton = 0x201; //定义了鼠标的左键点击消息 public const int USER = 0x0400 // 是windows系统定义的用户消息  2 消息发送   消息发送是通过windows提供的API函数SendMessage来实现的它的原型定义为  [DllImport("User32.dll",EntryPoint="SendMessage")]    private static extern int SendMessage(           int hWnd,   // handle to destination window           int Msg,    // message           int wParam, // first message parameter           int lParam // second message parameter     ); 3 消息的接受  在C#中,任何一个窗口都有也消息的接收处理函数,就是defproc函数 你可以在form中重载该函数来处理消息 protected override void DefWndProc ( ref System.WinForms.Message m ) { switch(m.msg) { case WM_Lbutton :  ///string与MFC中的CString的Format函数的使用方法有所不同  string message = string.Format("收到消息!参数为:{0},{1}",m.wParam,m.lParam);  MessageBox.Show(message);///显示一个消息框  break; default:  base.DefWndProc(ref m);///调用基类函数处理非自定义消息。  break; } } 其实,C#中的事件也是通过封装系统消息来实现的,如果你在DefWndProc函数中不处理该 那么,他会交给系统来处理该消息,系统便会通过代理来实现鼠标单击的处理函数,因此你可以通过 defproc函数来拦截消息,比如你想拦截某个按钮的单击消息 4 C#中其他的消息处理方法   在C#中有的时候需要对控件的消息进行预处理,比如你用owc的spreedsheet控件来处理Excel文件,你不想让用户可以随便选中 数据进行编辑,你就可以屏蔽掉鼠标事件,这个时候就必须拦截系统预先定义好的事件(这在MFC中称为子类化),你可以通过C#提供的一个接口 IMessageFilter来实现消息的过滤 public class Form1: System.Windows.Forms.Form,IMessageFilter {  const int WM_MOUSEMOVE = 0x200  public bool PreFilterMessage(ref Message m)   {  Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode;     if(m.Msg == m.Msg==WM_MOUSEMOVE) //||m.Msg == WM_LBUTTONDOWN    {     //MessageBox.Show("Ignoring Escape...");       return true;     }      return false;   } }

时间: 2024-10-27 14:06:43

C#中使用SendMessage的相关文章

在C#中使用SendMessage

在C#中使用SendMessage -------------------------------------------------------------------------------- 日期:2005-02-04作者:floodzhu备注:主要描述在调用API函数SendMessage时数据类型的转换. -------------------------------------------------------------------------------- SendMessag

vc中使用SendMessage自定义消息函数

  这篇文章主要介绍了vc中使用SendMessage自定义消息函数的相关资料,需要的朋友可以参考下 SendMessage的基本结构如下: ? 1 2 3 4 5 6 SendMessage( HWND hWnd, //消息传递的目标窗口或线程的句柄. UINT Msg, //消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,) WPARAM wParam, //参数1 (WPARAM 其实是与UINT是同种类型的, //在vc编译器中右键有个"转到WPARAM的定义"

sendmessage-请问在C#中使用SendMessage发送字符串给另一个exe程序?

问题描述 请问在C#中使用SendMessage发送字符串给另一个exe程序? 我自己写的WinForm程序发送成功,系统自带的计算器和记事本都发送成功,我是64位win7系统.但是我要修改的目标程序却无法发送成功.这个目标程序是关于证券交易的.使用SendMessage用WM_GETTEXT可以获取到这个目标程序里面的数据.现在问题是使用SendMessage用WM_SETTEXT无法把字符串修改到目标程序对应的控件中.控件句柄已经获取到了.另外,是不是有可能有保护呢?

C#中使用SendMessage进行进程通信的实例

原文:C#中使用SendMessage进行进程通信的实例 1 新建解决方案SendMessageSecondExample 在解决方案下面新建两个项目:Sender和Receiver,两者的输出类型均为"Windows 应用程序".整个程序的结构如下图所示.     2 实现项目Sender Sender仅包含一个名为"消息发送者"的窗体,如下图所示.   编写窗体后端代码,如下所示. using System; using System.Diagnostics;

C#中使用SendMessage在进程间传递数据的实例

原文:C#中使用SendMessage在进程间传递数据的实例 1 新建解决方案SendMessageExample 在解决方案下面新建三个项目:CopyDataStruct,Receiver和Sender. 其中,CopyDataStruct项目的输出类型为"类库",Receiver和Sender项目的输出类型为"Windows 应用程序". 整个实例程序的结构如下图所示.   2 CopyDataStruct项目实现 定义结构体COPYDATASTRUCT,代码如

关于多线程中使用SendMessage

如果,窗口是由非主线程创建的,那么,那个线程将会跑一个自己的窗口消息队列.调用SendMessage会切换到该线程上去执行. 主线程是个窗口线程,在另外一个工作线程中调用了窗口线程的SendMessage,那么执行的过程是: 1.工作线程挂起 2.切换到窗口线程,执行对应的消息处理 3.切换回工作线程 SendMessage : 如果指定窗口由调用线程创建,那么窗口过程会被当成一个子程序立即调用.如果指定窗口由另外一个线程创建,那么系统会切换到那个线程,并且调用合适的窗口过程.在线程之间传递的消

关于SendMessage

本文是对MSDN中关于SendMessage的翻译与小结. SendMessage函数功能描述:将指定的消息发送到一个或多个窗口.此函数为指 定的窗口调用窗口过程,直到窗口过程处理完消息后才返回. .函数原型: LRESULT SendMessage( HWND hWnd, // 目标窗口句柄 UINT Msg, // 被发送的消息 WPARAM wParam, // 第一个消息参数 LPARAM lParam // 第二个消息参数 ); .参数: hWnd 窗口过程接收消息的窗口句柄.如果此参

Android如何在自定义view中发送消息给主线程

问题描述 Android如何在自定义view中发送消息给主线程 求求各位大神支招,小弟在自己开发一个东西,遇到了一个小问题. ![ 图片说明](http://img.ask.csdn.net/upload/201603/15/1458054689_616589.jpg) 我在自定义view的onDraw里,当条件达到后就开启一个子线程发送消息给主线程,让主线程中的handler接收消息并执行相应的动作,可是在Log的输出下只能输出"子线程,"而没有"handlemessage

Android中invalidate()和postInvalidate() 的区别及使用方法_Android

Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用.       Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时,调