C# 中 SendMessage 函数

SendMessage:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。该函数是应用程序和应用程序之间进行消息传递的主要手段之一

函数原型:IntPtr SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lParam);

参数

hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口

Msg:指定被发送的消息

wParam:指定附加的消息指定信息

IParam:指定附加的消息指定信息返回值:返回值指定消息处理的结果,依赖于所发送的消息

备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。

示例:

const int BM_CLICK = 0xF5;
IntPtr maindHwnd = FindWindow(null, "QQ用户登录"); //获得QQ登陆框的句柄 hovertree.com
if (maindHwnd != IntPtr.Zero)
{
    IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "登录");   //获得按钮的句柄
    if (childHwnd != IntPtr.Zero)
    {
        SendMessage(childHwnd, BM_CLICK, 0, 0);     //发送点击按钮的消息
    }
    else
    {
        MessageBox.Show("没有找到子窗口");
    }
}
else
{
    MessageBox.Show("没有找到窗口");
}

wMsg常量值:

//创建一个窗口  
const int WM_CREATE = 0x01;  
//当一个窗口被破坏时发送  
const int WM_DESTROY = 0x02;  
//移动一个窗口  
const int WM_MOVE = 0x03;  
//改变一个窗口的大小  
const int WM_SIZE = 0x05;  
//一个窗口被激活或失去激活状态  
const int WM_ACTIVATE = 0x06;  
//一个窗口获得焦点  
const int WM_SETFOCUS = 0x07;  
//一个窗口失去焦点  
const int WM_KILLFOCUS = 0x08;  
//一个窗口改变成Enable状态  
const int WM_ENABLE = 0x0A;  
//设置窗口是否能重画  
const int WM_SETREDRAW = 0x0B;  
//应用程序发送此消息来设置一个窗口的文本  
const int WM_SETTEXT = 0x0C;  
//应用程序发送此消息来复制对应窗口的文本到缓冲区  
const int WM_GETTEXT = 0x0D;  
//得到与一个窗口有关的文本的长度(不包含空字符)  
const int WM_GETTEXTLENGTH = 0x0E;  
//要求一个窗口重画自己  
const int WM_PAINT = 0x0F;  
//当一个窗口或应用程序要关闭时发送一个信号  
const int WM_CLOSE = 0x10;  
//当用户选择结束对话框或程序自己调用ExitWindows函数  
const int WM_QUERYENDSESSION = 0x11;  
//用来结束程序运行  
const int WM_QUIT = 0x12;  
//当用户窗口恢复以前的大小位置时,把此消息发送给某个图标  
const int WM_QUERYOPEN = 0x13;  
//当窗口背景必须被擦除时(例在窗口改变大小时)  
const int WM_ERASEBKGND = 0x14;  
//当系统颜色改变时,发送此消息给所有顶级窗口  
const int WM_SYSCOLORCHANGE = 0x15;  
//当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束  
const int WM_ENDSESSION = 0x16;  
//当隐藏或显示窗口是发送此消息给这个窗口  
const int WM_SHOWWINDOW = 0x18;  
//发此消息给应用程序哪个窗口是激活的,哪个是非激活的  
const int WM_ACTIVATEAPP = 0x1C;  
//当系统的字体资源库变化时发送此消息给所有顶级窗口  
const int WM_FONTCHANGE = 0x1D;  
//当系统的时间变化时发送此消息给所有顶级窗口  
const int WM_TIMECHANGE = 0x1E;  
//发送此消息来取消某种正在进行的摸态(操作)  
const int WM_CANCELMODE = 0x1F;  
//如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口  
const int WM_SETCURSOR = 0x20;  
//当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给//当前窗口  
const int WM_MOUSEACTIVATE = 0x21;  
//发送此消息给MDI子窗口//当用户点击此窗口的标题栏,或//当窗口被激活,移动,改变大小  
const int WM_CHILDACTIVATE = 0x22;  
//此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序分离出用户输入消息  
const int WM_QUEUESYNC = 0x23;  
//此消息发送给窗口当它将要改变大小或位置  
const int WM_GETMINMAXINFO = 0x24;  
//发送给最小化窗口当它图标将要被重画  
const int WM_PAINTICON = 0x26;  
//此消息发送给某个最小化窗口,仅//当它在画图标前它的背景必须被重画  
const int WM_ICONERASEBKGND = 0x27;  
//发送此消息给一个对话框程序去更改焦点位置  
const int WM_NEXTDLGCTL = 0x28;  
//每当打印管理列队增加或减少一条作业时发出此消息   
const int WM_SPOOLERSTATUS = 0x2A;  
//当button,combobox,listbox,menu的可视外观改变时发送  
const int WM_DRAWITEM = 0x2B;  
//当button, combo box, list box, list view control, or menu item 被创建时  
const int WM_MEASUREITEM = 0x2C;  
//此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息   
const int WM_VKEYTOITEM = 0x2E;  
//此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息   
const int WM_CHARTOITEM = 0x2F;  
//当绘制文本时程序发送此消息得到控件要用的颜色  
const int WM_SETFONT = 0x30;  
//应用程序发送此消息得到当前控件绘制文本的字体  
const int WM_GETFONT = 0x31;  
//应用程序发送此消息让一个窗口与一个热键相关连   
const int WM_SETHOTKEY = 0x32;  
//应用程序发送此消息来判断热键与某个窗口是否有关联  
const int WM_GETHOTKEY = 0x33;  
//此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标  
const int WM_QUERYDRAGICON = 0x37;  
//发送此消息来判定combobox或listbox新增加的项的相对位置  
const int WM_COMPAREITEM = 0x39;  
//显示内存已经很少了  
const int WM_COMPACTING = 0x41;  
//发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数  
const int WM_WINDOWPOSCHANGING = 0x46;  
//发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数  
const int WM_WINDOWPOSCHANGED = 0x47;  
声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 1
收藏 2
关注 18
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧