精华内容
下载资源
问答
  • 代码如下,蓝色部分代码运作正常,红色部分编译出任何问题,但是就是找到生成窗体hwnd后(通过spy++查看出错),用SendMessage对该窗体发送消息任何反应。求求斑竹和各路高手解决,分不多,希望有人能拿下 ...
  • 下面是代码,执行没反应,请告诉我哪里错了,或者用什么方法可以进行测试。 Option Explicit Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As...
  • 但是从看门狗中用sendMessage功能或则DestroyWindow功能,MFC程序都没反应。(发送VM_CLOSE就可以正常退到托盘标示,在MFC中我安装了按钮可以关联onDestroy函数也可以正常关闭退出) 在网上看了很多教程和资料,都...
  • 使用 SendMessage(hwnd, 0x10, 0, 0)可以关闭按钮 //VM_CLOSE 但是使用,sendmessage(hwnd, 0xF5, 0, 0)却点击不了按钮。 //BM_CLICK 求助!!!
  • SendMessage(hwnd,WM_LBUTTONDOWN,NULL,x+(y<<16)); SendMessage(hwnd,WM_LBUTTONUP,NULL,x+(y<<16)); Sleep(10000); } 用上面的代码实现关闭象棋巫师程序,(828,8)是窗口的关闭按钮坐标,为...
  • 在C# winfrom项目中,使用SendMessage使“CBox 央视影音”实现双击全屏,但是没有效果,无法实现双击全屏; 代码如下,帮忙看看如何修改下。 [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError =...
  • 我先获取了listbox的句柄,然后选中了第一项,然后再双击左键,可是双击完木有反应,不知道怎么回事 我用SPY监视消息信息,发现发送消息以后,spy里面显示消息的fwkeys是MK_RBUTTON,不是应该是MK_LBUTTON吗
  • ON_MESSAGE 使用方法, 一个线程工作函数中向窗口发送消息,SendMessage 使用方法.
  • pywin32 sendmessage问题

    2020-09-09 23:19:28
    请问这段代码执行了为什么没有反应? 我是想移动鼠标到某个位置然后左键单击一次

    在这里插入图片描述
    请问这段代码执行了为什么没有反应?

    我是想移动鼠标到某个位置然后左键单击一次

    展开全文
  • 利用SendMessage模拟鼠标左键双击打开文件,但是文件打开。打印4次结果0。请熟悉Windows编程的大神指点 ``` // SendMessage.cpp : Defines the entry point for the console application. // #include ...
  • SendMessage 窗口函数

    2013-10-25 13:29:00
    LRESULT WINAPI SendMessage( _In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam ); 参数: hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到...

    函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。

    MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx

    LRESULT WINAPI SendMessage(
      _In_  HWND hWnd,
      _In_  UINT Msg,
      _In_  WPARAM wParam,
      _In_  LPARAM lParam
    );

    参数:
    hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
    Msg:指定被发送的消息。系统消息列表.http://msdn.microsoft.com/en-us/library/windows/desktop/ms644927(v=vs.85).aspx#system_defined
    wParam:指定附加的消息指定信息。
    IParam:指定附加的消息指定信息。

    系统消息列表:

    Windows系统定义的消息类别

    Prefix前缀Message category 消息类别Documentation 参考资料
    ABM and ABNApplication desktop toolbarShell Messages and Notifications
    ACM and ACNAnimation controlAnimation Control Messages and Animation Control Notifications
    BCMBCNBM, and BNButton controlButton Control Messages and Button Control Notifications
    CB and CBNComboBox controlComboBox Control Messages and ComboBox Control Notifications
    CBEM andCBENComboBoxEx controlComboBoxEx Messages and ComboBoxEx Notifications
    CCMGeneral controlControl Messages
    CDMCommon dialog boxCommon Dialog Box Messages
    DFMDefault context menuShell Messages and Notifications
    DLDrag list boxDrag List Box Notifications
    DMDefault push button controlDialog Box Messages
    DTM and DTNDate and time picker controlDate and Time Picker Messages and Date and Time Picker Notifications
    EM and ENEdit controlEdit Control MessagesEdit Control NotificationsRich Edit Messages, and Rich Edit Notifications
    HDM and HDNHeader controlHeader Control Messages and Header Control Notifications
    HKMHot key controlHot Key Control Messages
    IPM and IPNIP address controlIP Address Messages and IP Address Notifications
    LB and LBNList box controlList Box Messages and List Box Notifications
    LMSysLink controlSysLink Control Messages
    LVM and LVNList view controlList View Messages and List View Notifications
    MCM and MCNMonth calendar controlMonth Calendar Messages and Month Calendar Notifications
    PBMProgress barProgress Bar Messages
    PGM and PGNPager controlPager Control Messages and Pager Control Notifications
    PSM and PSNProperty sheetProperty Sheet Messages and Property Sheet Notifications
    RB and RBNRebar controlRebar Control Messages and Rebar Control Notifications
    SB and SBNStatus bar windowStatus Bar Messages and Status Bar Notifications
    SBMScroll bar controlScroll Bar Messages
    SMCShell menuShell Messages and Notifications
    STM and STNStatic controlStatic Control Messages and Static Control Notifications
    TB and TBNToolbarToolbar Control Messages and Toolbar Control Notifications
    TBM and TRBNTrackbar controlTrackbar Control Messages and Trackbar Control Notifications
    TCM and TCNTab controlTab Control Messages and Tab Control Notifications
    TDM and TDNTask dialogTask Dialog Messages and Task Dialog Notifications
    TTM and TTNTooltip controlTooltip Control Messages and Tooltip Control Notifications
    TVM and TVN

    Tree-view control

     

    Tree View Messages and Tree View Notifications
    UDM and UDN

    Up-down control

    控件消息

    Up-Down Messages and Up-Down Notifications
    WM

    General

    普通窗口消息

    Clipboard Messages Clipboard Notifications Common Dialog Box Notifications Cursor Notifications Data Copy Message Desktop Window Manager Messages Device Management Messages Dialog Box Notifications Dynamic Data Exchange Messages Dynamic Data Exchange Notifications Hook Notifications Keyboard Accelerator Messages Keyboard Accelerator Notifications Keyboard Input Messages Keyboard Input Notifications Menu Notifications Mouse Input Notifications Multiple Document Interface Messages Raw Input Notifications Scroll Bar Notifications Timer Notifications Window Messages Window Notifications

    ABM 应用桌面工具栏消息
    BM 按钮控件消息
    CB 组合框控件消息
    CBEM 扩展组合框控件消息
    CDM 通用对话框消息
    DBT 设备消息
    DL 拖曳列表框控件消息
    DM 默认按钮控件消息
    DTM 日期时间选取控件消息
    EM 编辑控件消息
    HDM 头控件消息
    HKM 热键控件消息
    IPM IP地址控件消息
    LB 列表框控件消息
    LVM 列表视图控件消息
    MCM 月历控件消息
    PBM 进度条控件消息
    PGM Pager控件消息
    PSM 属性页面消息
    RB Rebar 控件消息
    SB 状态栏窗口消息
    SBM 滚动条控件消息
    STM 静态控件消息
    TB 工具栏消息
    TBM 跟踪条控件消息
    TCM Tab 控件消息
    TTM Tooltip控件消息
    TVM 树形控件消息
    UDM Up-down 控件消息
    WM 普通窗口消息

    http://blog.csdn.net/a199228/article/details/6627778

     

    wMsg
    WM_CREATE 创建一个窗口
    WM_DESTROY 当一个窗口被破坏时发送
    WM_MOVE 移动一个窗口
    WM_SIZE 改变一个窗口的大小
    WM_ACTIVATE 一个窗口被激活或失去激活状态
    WM_SETFOCUS 一个窗口获得焦点
    WM_KILLFOCUS 一个窗口失去焦点
    WM_ENABLE 一个窗口改变成Enable状态
    WM_SETREDRAW 设置窗口是否能重画
    WM_SETTEXT 应用程序发送此消息来设置一个窗口的文本
    WM_GETTEXT 应用程序发送此消息来复制对应窗口的文本到缓冲区
    WM_GETTEXTLENGTH 得到与一个窗口有关的文本的长度(不包含空字符)
    WM_PAINT 要求一个窗口重画自己
    WM_CLOSE 当一个窗口或应用程序要关闭时发送一个信号
    WM_QUERYENDSESSION 当用户选择结束对话框或程序自己调用ExitWindows函数
    WM_QUIT 用来结束程序运行
    WM_QUERYOPEN 当用户窗口恢复以前的大小位置时,把此消息发送给某个图标
    WM_ERASEBKGND 当窗口背景必须被擦除时(例在窗口改变大小时)
    WM_SYSCOLORCHANGE 当系统颜色改变时,发送此消息给所有顶级窗口
    WM_ENDSESSION 当系统进程发出 WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束
    WM_SHOWWINDOW 当隐藏或显示窗口是发送此消息给这个窗口
    WM_ACTIVATEAPP 发此消息给应用程序哪个窗口是激活的,哪个是非激活的
    WM_FONTCHANGE 当系统的字体资源库变化时发送此消息给所有顶级窗口
    WM_TIMECHANGE 当系统的时间变化时发送此消息给所有顶级窗口
    WM_CANCELMODE 发送此消息来取消某种正在进行的摸态(操作)
    WM_SETCURSOR 如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口
    WM_MOUSEACTIVATE 当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
    WM_CHILDACTIVATE 发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小
    WM_QUEUESYNC 此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序分离出用户输入消息
    WM_GETMINMAXINFO 此消息发送给窗口当它将要改变大小或位置
    WM_PAINTICON 发送给最小化窗口当它图标将要被重画
    WM_ICONERASEBKGND 此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画
    WM_NEXTDLGCTL 发送此消息给一个对话框程序去更改焦点位置
    WM_SPOOLERSTATUS 每当打印管理列队增加或减少一条作业时发出此消息
    WM_DRAWITEM 当button,combobox,listbox,menu的可视外观改变时发送
    WM_MEASUREITEM 当button, combo box, list box, list view control, or menu item 被创建时
    WM_VKEYTOITEM 此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息
    WM_CHARTOITEM 此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息
    WM_SETFONT 当绘制文本时程序发送此消息得到控件要用的颜色
    WM_GETFONT 应用程序发送此消息得到当前控件绘制文本的字体
    WM_SETHOTKEY 应用程序发送此消息让一个窗口与一个热键相关连
    WM_GETHOTKEY 应用程序发送此消息来判断热键与某个窗口是否有关联
    WM_QUERYDRAGICON 此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标
    WM_COMPAREITEM 发送此消息来判定combobox或listbox新增加的项的相对位置
    WM_COMPACTING 显示内存已经很少了
    WM_WINDOWPOSCHANGING 发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数
    WM_WINDOWPOSCHANGED 发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数
    WM_POWER 当系统将要进入暂停状态时发送此消息
    WM_COPYDATA 当一个应用程序传递数据给另一个应用程序时发送此消息
    WM_CANCELJOURNA 当某个用户取消程序日志激活状态,提交此消息给程序
    WM_NOTIFY 当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口
    WM_INPUTLANGCHANGEREQUEST 当用户选择某种输入语言,或输入语言的热键改变
    WM_INPUTLANGCHANGE 当平台现场已经被改变后发送此消息给受影响的最顶级窗口
    WM_TCARD 当程序已经初始化windows帮助例程时发送此消息给应用程序
    WM_HELP 此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
    WM_USERCHANGED 当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息
    WM_NOTIFYformAT 公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构
    WM_CONTEXTMENU 当用户某个窗口中点击了一下右键就发送此消息给这个窗口
    WM_styleCHANGING 当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口
    WM_styleCHANGED 当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口
    WM_DISPLAYCHANGE 当显示器的分辨率改变后发送此消息给所有的窗口
    WM_GETICON 此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄
    WM_SETICON 程序发送此消息让一个新的大图标或小图标与某个窗口关联
    WM_NCCREATE 当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送
    WM_NCDESTROY 此消息通知某个窗口,非客户区正在销毁
    WM_NCCALCSIZE 当某个窗口的客户区域必须被核算时发送此消息
    WM_NCHITTEST 移动鼠标,按住或释放鼠标时发生
    WM_NCPAINT 程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时
    WM_NCACTIVATE 此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态
    WM_GETDLGCODE 发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件通过应
    WM_NCMOUSEMOVE 当光标在一个窗口的非客户区内移动时发送此消息给这个窗口 非客户区为:窗体的标题栏及窗 的边框体
    WM_NCLBUTTONDOWN 当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息
    WM_NCLBUTTONUP 当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息
    WM_NCLBUTTONDBLCLK 当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息
    WM_NCRBUTTONDOWN 当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息
    WM_NCRBUTTONUP 当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息
    WM_NCRBUTTONDBLCLK 当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息
    WM_NCMBUTTONDOWN 当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息
    WM_NCMBUTTONUP 当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息
    WM_NCMBUTTONDBLCLK 当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息
    WM_KEYFIRST WM_KEYDOWN 按下一个键
    WM_KEYUP 释放一个键
    WM_CHAR 按下某键,并已发出WM_KEYDOWN, WM_KEYUP消息
    WM_DEADCHAR 当用translatemessage函数翻译
    WM_KEYUP消息时发送此消息给拥有焦点的窗口
    WM_SYSKEYDOWN 当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口
    WM_SYSKEYUP 当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口
    WM_SYSCHAR 当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口
    WM_SYSDEADCHAR 当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口
    WM_INITDIALOG 在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务
    WM_COMMAND 当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译
    WM_SYSCOMMAND 当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息
    WM_TIMER 发生了定时器事件
    WM_HSCROLL 当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件
    WM_VSCROLL 当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件
    WM_INITMENU 当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单
    WM_INITMENUPOPUP 当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部
    WM_MENUSELECT 当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)
    WM_MENUCHAR 当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者
    WM_ENTERIDLE 当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待
    WM_CTLCOLORMSGBOX 在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色
    WM_CTLCOLOREDIT 当一个编辑型控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色
    WM_CTLCOLORLISTBOX 当一个列表框控件将要被绘制前发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色
    WM_CTLCOLORBTN 当一个按钮控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色
    WM_CTLCOLORDLG 当一个对话框控件将要被绘制前发送此消息给它的父窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色
    WM_CTLCOLORSCROLLBAR 当一个滚动条控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色
    WM_CTLCOLORSTATIC 当一个静态控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以 通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色
    WM_MOUSEFIRST WM_MOUSEMOVE 移动鼠标
    WM_LBUTTONDOWN 按下鼠标左键
    WM_LBUTTONUP 释放鼠标左键
    WM_LBUTTONDBLCLK 双击鼠标左键
    WM_RBUTTONDOWN 按下鼠标右键
    WM_RBUTTONUP 释放鼠标右键
    WM_RBUTTONDBLCLK 双击鼠标右键
    WM_MBUTTONDOWN 按下鼠标中键
    WM_MBUTTONUP 释放鼠标中键
    WM_MBUTTONDBLCLK 双击鼠标中键
    WM_MOUSEWHEEL 当鼠标轮子转动时发送此消息个当前有焦点的控件
    WM_PARENTNOTIFY 当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口
    WM_ENTERMENULOOP 发送此消息通知应用程序的主窗口that已经进入了菜单循环模式
    WM_EXITMENULOOP 发送此消息通知应用程序的主窗口that已退出了菜单循环模式
    WM_SIZING 当用户正在调整窗口大小时发送此消息给窗口 通过此消息应用程序可以监视窗口大小和位置也可以修改他们
    WM_CAPTURECHANGED 发送此消息 给窗口当它失去捕获的鼠标时
    WM_MOVING 当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置也可以修改他们
    WM_POWERBROADCAST 此消息发送给应用程序来通


    知它有关电源管理事件
    WM_DEVICECHANGE 当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序
    WM_MDIDESTROY 应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口
    WM_MDIACTIVATE 应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口,当客户窗口收到此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)激活它
    WM_MDIRESTORE 程序 发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小
    WM_MDINEXT 程序 发送此消息给MDI客户窗口激活下一个或前一个窗口
    WM_MDIMAXIMIZE 程序发送此消息给MDI客户窗口来最大化一个MDI子窗口
    WM_MDITILE 程序 发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口
    WM_MDICASCADE 程序 发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口
    WM_MDIICONARRANGE 程序 发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口
    WM_MDIGETACTIVE 程序 发送此消息给MDI客户窗口来找到激活的子窗口的句柄
    WM_MDISETMENU 程序 发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单
    WM_CUT 程序发送此消息给一个编辑框或combobox来删除当前选择的文本
    WM_COPY 程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板
    WM_PASTE 程序发送此消息给editcontrol或combobox从剪贴板中得到数据
    WM_CLEAR 程序发送此消息给editcontrol或combobox清除当前选择的内容
    WM_UNDO 程序发送此消息给editcontrol或combobox撤消最后一次操作
    WM_DESTROYCLIPBOARD 当调用ENPTYCLIPBOARD函数时 发送此消息给剪贴板的所有者
    WM_DRAWCLIPBOARD 当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口 它允许用剪贴板观察窗口来显示剪贴板的新内容
    WM_PAINTCLIPBOARD 当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画
    WM_SIZECLIPBOARD 当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者
    WM_ASKCBformATNAME 通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字
    WM_CHANGECBCHAIN 当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口
    WM_HSCROLLCLIPBOARD 此消息通过一个剪贴板观察窗口发送给剪贴板的所有者 它发生在当剪贴板包含CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上 所有者应滚动剪贴板图象并更新滚动条的值
    WM_QUERYNEWPALETTE 此消息发送给将要收到焦点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板
    WM_PALETTEISCHANGING 当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序
    WM_PALETTECHANGED 此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此来改变系统调色板
    WM_HOTKEY 当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息
    WM_PRINT 应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分

    Buttons

    BM_CLICK button被点击 消息

    BM_GETCHECK 用于check boxes 或radio boxes 。查看 是否 checked 了。

    BM_GETSTATE 发送此消息,可返回 button 的状态,如 是否被 checked;是否 可用(不可用就 变灰了)

    BM_SETCHECK 如果 已经 checked 了,发送此消息后,变为 unchecked,就是 那个钩钩 没被 选上。ok?

    BM_SETSTATE 设置 button被 点击 状态。

    ====================

    Combo Boxes

    CB_ADDSTRING 添加 字符串到 Combo Boxes 。

    CB_DELETESTRING 删除 Combo Boxes 中的 条目,既 item

    CB_GETCOUNT 得到 Combo Boxes 条目 item 的 数目

    CB_GETCURSEL 返回 Combo Boxes 中被选 条目 在 Combo Boxes 中 的位置,第一条为0 。

    如果 没有 条目或出错,则返回 -1

    CB_GETDROPPEDSTATE 发送此消息,可判断 Combo Boxes 的list box 是否被 放下,如果 是,返回 非零值,不是,则 返回 0

    CB_GETLBTEXT 得到 combo box 的 条目 的text。 返回值 是 这个text 的长度。

    CB_GETLBTEXTLEN 返回值 是 条目的 text 的长度。

    CB_INSERTSTRING 插入 字符串 条目到 combo box 中

    CB_RESETCONTENT 清空 combo box 所有条目

    CB_SETCURSEL 设置 combo box 被选 条目。

    CB_SHOWDROPDOWN 让 combo box 的listbox 下拉。 既 显出 所有 条目

    ===================

    Edit Controls

    EM_CANUNDO 决定 上一次操作 是否可以 undo (撤消操作)。如果可以,则可发送 EM_undo

    EM_GETFIRSTVISIBLELINE 在 multi-line 控件中,找到 最上层的 可见的 行号。次行号是相对于 所有行的。

    EM_GETPASSWORDCHAR 返回 密码框的 字符集。既 是查看密码。

    EM_GETSEL 返回在 可编辑 控件中 ,被选择(HIGHLIGHT高量选择)的字符集 的 起点 和终点的 位置。

    用 sendmessage 的wParam 参数 返回 起点位置,lParam 返回 终点位置

    EM_REPLACESEL 用不同的字符串 替换 可编辑 控件 中的 字符串,如果 可编辑 控件中 没有 字符串,则 此消息变为 添加 字符串

    EM_SETPASSWORDCHAR 在可编辑 控件中 设置 密码字符集 ,既 用* 代替

    EM_UNDO 发送 操作 撤消 消息。

    ======================

    IP Address Control

    ===================

    IPM_CLEARADDRESS 清除 IP 地址控件(IP Address control)的内容

    IPM_GETADDRESS 从IP 地址控件 获得 存储在 它中的 IP 地址 信息/

    IPM_ISBLANK 决定 IP 地址控件 是否可以为 空值。既 127.0.0.1 之类的地址 为 空。

    IPM_SETADDRESS 在 IP 地址控件中设置 IP 地址。

    IPM_SETFOCUS 在 IP 地址控件中,当需要输入 IP 地址时, 使之获得 键盘输入 焦点

    IPM_SETRANGE 设置 输入IP 地址的有效范围

    =====================

    Media Control Interface (MCI)

    =============================

    MM_MCINOTIFY 告诉 窗体 MCI 命令 完成的状态. 这个 状态包括 success, failure, 或 其它事件

    Menus

    =============================

    WM_COMMAND 当 用户 选择 菜单中的 项目后,将向 窗体 发送此消息. 窗体 受到 此消息后,再 决定 下一个 行为

    WM_INITMENU 当 菜单 准备 显示 前,向 窗体发送 此消息, 窗体 将 初始化 菜单 项.

    WM_SYSCOMMAND 向 窗体 发送 用户点击 系统菜单 消息. 窗体将 响应 这个消息 ,决定 下个 行为.

    ================

    Windows

    =====================

    WM_CLOSE 发送 让窗体关闭的消息,有些窗体会 在此时 弹出个 关闭对话框。

    WM_GETTEXT 返回 窗体 标题栏 (caption 属性)。 需要先 用WM_GETTEXTLENGTH 获得 字符串长度

    WM_GETTEXTLENGTH 见上!

    WM_HELP 发送此 消息后,将 显示 指定的 HELP 文件

    WM_SETTEXT 设置 窗体 标题栏 。

    ==============================

    List Boxes

    ===============

    LB_ADDSTRING 在条目中添加 字符串

    LB_DELETESTRING 删除一个 条目. 条目 序号是从 0 开始的.

    LB_GETCOUNT 得到 条目总数.

    LB_GETCURSEL 得到 单选 的list box 的 选项条目的 序号

    LB_GETSEL 判断 list 的 条目 是否被选上, 如果 选上了,则返回 >0 的值.否则 返回 0 ,表示 用户没选择条目

    LB_GETSELCOUNT 获得 可多选 的list , 被用户选择的条目的个数.

    LB_GETSELITEMS 返回 可多选的list 的 被选条目的 序号. 可返回 数组.

    LB_GETTEXT 得到 list中的 一个 条目的 text 值

    LB_GETTEXTLEN 得到 list中的 一个 条目的 text 值的长度

    LB_INSERTSTRING 在list 中,插入 一个条目。如果成功,将返回 插入后,此条目的序号。

    LB_RESETCONTENT 清空 所有的 list 中的 条目。

    LB_SETCURSEL 对单选 的list box, 设定 用户 选择条目的 具体值

    LB_SETSEL 对多选 的list box, 设定 用户 选择条目的 具体值

    =======================================================

    Mouse

    ==================

    WM_LBUTTONDBLCLK 当鼠标在一个窗体范围内时,告诉此窗体 鼠标左键 已双击 。返回值 0

    WM_LBUTTONDOWN 当鼠标在一个窗体范围内时,告诉此窗体 鼠标左键 已点击,返回值 0

    WM_LBUTTONUP 当鼠标在一个窗体范围内时,告诉此窗体 鼠标左键 已释放,返回值 0

    WM_MBUTTONDBLCLK 当鼠标在一个窗体范围内时,告诉此窗体 鼠标中键 已双击 。返回值 0

    WM_MBUTTONDOWN 当鼠标在一个窗体范围内时,告诉此窗体 鼠标中键 已点击,返回值 0

    WM_MBUTTONUP 当鼠标在一个窗体范围内时,告诉此窗体 鼠标中键 已释放,返回值 0


    SendMessage用例

    SendMessage(hWnd,WM_SETFOCUS,0,0);
    SendMessage(hWnd,WM_ACTIVATE,1,0);

    SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);
    SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);
    SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);
    SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);
    SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);
    SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);
    SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);
    SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);
    SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);
    SendMessage(hWnd,WM_KEYDOWN,VK_RETURN,0x001c0001);
    SendMessage(hWnd,WM_CHAR,VK_RETURN,0x001c0001);
    SendMessage(HWND, WM_SYSCOMMAND, SC_MAXIMIZE, ByVal 0&) '最大化

    SendMessage HWND, WM_SHOWWINDOW, SW_HIDE, vbNull '隐藏窗体
    SendMessage HWND, WM_SHOWWINDOW, SW_NORMAL, vbNull '显示窗体

    SendMessage(HWND, CB_SHOWDROPDOWN, -1, -1) '显示Combo1.hwnd下拉列表

    SendMessage (Combo1.hWnd, CB_SHOWDROPDOWN, 0, 0 ) '不下拉

    SendMessage(HWND, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&) '关闭
    SendMessage(HWND, WM_SYSCOMMAND, SC_MINIMIZE, ByVal 0&) '最小化
    SendMessage(HWND, WM_PASTE, 0, 0) '粘贴
    SendMessage(HWND, WM_COPY, 0, 0) '复制
    SendMessage(HWND, WM_UNDO, 0, 0) '撤消
    SendMessage(HWND, WM_SETTEXT, 0, ByVal new_caption) 'f发文本信息
    SendMessage(HWND, WM_KEYDOWN, Asc("b"), 0&) '发送按键 只能用于 控件 不能用与整个窗体或进程
    SendMessage(HWND, WM_LBUTTONDOWN, MK_LBUTTON, ByVal &H10001) '鼠标模拟
    WindowFromPoint(Cursor.x, Cursor.y) '获得鼠标当前句柄
    GetPixel(dc, Cursor.x, Cursor.y) '获取鼠标点颜色
    SendMessage(HWND, WM_CUT, 0, 0) '剪切 但单击按钮会使其失去焦点 这里不做演示

    获得光标位置和字符个数.
    Cpos = SendMessage(Text1.hwnd, 187, -1, 0) '光标所在行的首字符在文本中的位置
    Lpos = SendMessage(Text1.hwnd, 201, Cpos, 0) '光标所在的行号
    Line = SendMessage(Text1.hwnd, 193, Cpos, 0) '这行的字符数.
    SendMessage (Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0 )'关闭显示器.
    SendMessage Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1 ')打开显示器
    SendMessage(mText.hwnd, EM_GETRECT, 0, rc) '获得窗口区域的边界

    SendMessage hWnd, WM_KEYDOWN, VK_CONTROL, ByVal 0& )
    SendMessage hWnd, WM_KEYDOWN, VK_X, ByVal 0&)
    SendMessage hWnd, WM_KEYUP, VK_X, ByVal 0& )
    SendMessage hWnd, WM_KEYUP, VK_CONTROL, ByVal 0&)

    Windows消息机制要点:

    一、 引言

    二、Windows消息机制的概念

    1、DOS与Windows驱动机制的区别

    2、消息

    3、消息的来源

    4、Windows的消息系统的组成

    5、消息的响应

    三、Windows消息机制要点

    1. 窗口过程

    2 消息类型

    3消息队列(Message Queues)

    4 队列消息和非队列消息

    5 Windows消息函数

    6消息死锁( Message Deadlocks

    7 BroadcastSystemMessage

    四、MFC消息机制

    1.MFC框架下,接收处理来自Windows消息的过程

    2.MFC内部消息处理方式

    一、 引言

    在 C++程序架构 一文中,我们看到,程序是由一些层次和模块组成的,那么,这些模块之间, 以及你的程序和windows 之间,是如何传递信息呢?在windows 的平台上,传递信息是由 windows message 消息机制来负责的,这是Windows 的核心部分。

    消息包括数据和指令。

    二、Windows消息机制的概念

    1、DOS与Windows驱动机制的区别

    1)DOS是过程驱动的。

    传统的MS-DOS程序主要采用顺序的。关联的、过程驱动的程序设计方法。一个过程是一系列预先定义好的操作序列的组合,它具有一定的开头、中间过程和结束。程序直接控制程序事件和过程的顺序。这样的程序设计方法是面向程序而不是面向用户的,交互性差,用户界面不够友好,因为它强迫用户按照某种不可更改的模式进行工作。它的基本模型如图1.1所示。

    2)Windows是事件(消息)驱动

    事件驱动程序设计是一种全新的程序设计方法,它不是由事件的顺序来控制,而是由事件的发生来控制,而这种事件的发生是随机的、不确定的,并没有预定的顺序,这样就允许程序的的用户用各种合理的顺序来安排程序的流程。对于需要用户交互的应用程序来说,事件驱动的程序设计有着过程驱动方法无法替代的优点。它是一种面向用户的程序设计方法,它在程序设计过程中除了完成所需功能之外,更多的考虑了用户可能的各种输入,并针对性的设计相应的处理程序。它是一种“被动”式程序设计方法,程序开始运行时,处于等待用户输入事件状态,然后取得事件并作出相应反应,处理完毕又返回并处于等待事件状态。它的框图如图1.2所示:

    2、消息

    Windows系统是一个事件驱动的OS,每一个事件的发生都会产生一个消息,我们通过消息来知道发生了什么事件,了解事件,进而解决事件。什么是消息呢?很难下一个定义,下面从不同的几个方面讲解一下:

    1) 消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。

    2)谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。
    3)未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。

    4)窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。

    3、消息的来源

    事件驱动围绕着消息的产生与处理展开,一条消息是关于发生的事件的消息。事件驱动是靠消息循环机制来实现的。也可以理解为消息是一种报告有关事件发生的通知。

    Windows应用程序的消息来源有一下四种:

    1)输入消息:包括键盘和鼠标的输入。这一类消息首先放在系统消息队列中,然后由Windows将它们送入应用程序消息队列中,由应用程序来处理消息。

    2)控制消息:用来与Windows的控制对象,如列表框、按钮、检查框等进行双向通信。当用户在列表框中改动当前选择或改变了检查框的状态时发出此类消息。这类消息一般不经过应用程序消息队列,而是直接发送到控制对象上去。

    3)系统消息:对程序化的事件或系统时钟中断作出反应。一些系统消息,象DDE消息(动态数据交换消息)要通过Windows的系统消息队列,而有的则不通过系统消息队列而直接送入应用程序的消息队列,如创建窗口消息。

    4)用户消息:这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。

    4、Windows的消息系统的组成

    Windows的消息系统由以下3部分组成:

    消息队列:Windows能够为所有的应用程序维护一个消息队列,应用程序必须从消息队列中获去消息,然后分派给某个窗体。

    消息循环:通过这个循环机制,应用程序从消息队列中检索消息,再把它分派给适当的窗口,然后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。

    窗口过程:每个窗口都有一个窗口过程,以接收Windows 传递给窗口的消息,窗口过程的任务就是获取消息并且响应它。窗口过程是一个回调函数,处理完一个消息后,通常要给Windows 一个返回值。

    5、消息的响应

    消息的产生来源于系统事情(包括计时器事件)和用户事情,Windows用消息来调入和关闭(还有其它处理,如绘制一个窗口等)应用程序,一个典型表现是在关机操作中,Windows发一个关机的消息给所有正在运行的应用程序,告知它们退出内存,此时,应用程序用回应消息的方法来响应OS,因此,消息是应用程序与WinOS交互的手段..

    消息产生到被窗口响应的步骤:(如下图)

    1> 系统发生了或用户发出某个事件。

    2> Windows把这个事件翻译为消息,然后把他放到消息队列中

    3> 应用程序从消息队列中接受到这个消息,把他存放到TMsg记录中。

    4> 应用程序把消息传递给一个适当的窗体过程。

    窗体过程响应这个消息并进行处理。把消息传递给了这个窗体的窗体函数。

    三、Windows消息机制要点

    1. 窗口过程

    每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wParam, lParam), 当窗口收到消息时系统就会调用此窗口过程来处理消息。(所以叫回调函数)

    2 消息类型

    1) 系统定义消息(System-Defined Messages)

    在SDK中事先定义好的消息,非用户定义的,其范围在[0×0000, 0×03ff]之间, 可以分为以下三类:

    窗口消息(Windows Message)

    与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。可以是一般的窗口,可以是 Dialog,控件等。

    如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL..

    命令消息(Command Message)

    与处理用户请求有关, 如单击菜单项或工具栏或控件时, 就会产生命令消息。

    WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。如果是控件, HIWORD(wParam)表示控件消息类型

    控件通知(Notify Message)

    控件通知消息, 这是最灵活的消息格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。NMHDR包含控件通知的内容, 可以任意扩展。

    2) 程序定义消息(Application-Defined Messages)

    用户自定义的消息, 对于其范围有如下规定:

    WM_USER: 0×0400-0×7FFF (ex. WM_USER+10)

    WM_APP(winver>4.0): 0×8000-0xBFFF (ex.WM_APP+4)

    RegisterWindowMessage: 0xC000-0xFFFF

    3消息队列(Message Queues)

    Windows中有两种类型的消息队列

    1) 系统消息队列(System Message Queue)

    这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理

    2) 线程消息队列(Thread-specific Message Queue)
    每一个GUI线程都会维护这样一个线程消息队列。(这个队列只有在线程调用GDI函数时才会创建,默认不创建)。然后线程消息队列中的消息会被送到相应的窗口过程(WndProc)处理.

    注意: 线程消息队列中WM_PAINT,WM_TIMER只有在Queue中没有其他消息的时候才会被处理,WM_PAINT消息还会被合并以提高效率。其他所有消息以先进先出(FIFO)的方式被处理。

    4 队列消息(Queued Messages)和非队列消息(Non-Queued Messages)
    1)队列消息(Queued Messages)

    消息会先保存在消息队列中,消息循环会从此队列中取消息并分发到各窗口处理

    如鼠标,键盘消息。

    2) 非队列消息(NonQueued Messages)

    消息会绕过系统消息队列和线程消息队列直接发送到窗口过程被处理

    如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED

    注意: postMessage发送的消息是队列消息,它会把消息Post到消息队列中; SendMessage发送的消息是非队列消息, 被直接送到窗口过程处理

    5 Windows消息函数

    1)PostMessage(PostThreadMessage), SendMessage

    PostMessage:把消息放到指定窗口所在的线程消息队列中后立即返回。 PostThreadMessage:把消息放到指定线程的消息队列中后立即返回。

    SendMessage:直接把消息送到窗口过程处理, 处理完了才返回。

    2)GetMessage, PeekMessage

    PeekMessage会立即返回 可以保留消息

    GetMessage在有消息时返回 会删除消息

    3) TranslateMessage, TranslateAccelerator

    TranslateMessage: 把一个virtual-key消息转化成字符消息(character message),并放到当前线程的消息队列中,消息循环下一次取出处理。

    TranslateAccelerator: 将快捷键对应到相应的菜单命令。它会把WM_KEYDOWN 或 WM_SYSKEYDOWN转化成快捷键表中相应的WM_COMMAND 或WM_SYSCOMMAND消息, 然后把转化后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口过程处理, 处理完后才会返回。

    6消息死锁( Message Deadlocks

    假设有线程A和B, 现在有以下下步骤

    1) 线程A SendMessage给线程B, A等待消息在线程B中处理后返回

    2)线程B收到了线程A发来的消息,并进行处理, 在处理过程中,B也向线程A SendMessgae,然后等待从A返回。

    因为此时, 线程A正等待从线程B返回, 无法处理B发来的消息, 从而导致了\线程A,B相互等待, 形成死锁。多个线程也可以形成环形死锁。

    可以使用 SendNotifyMessage或SendMessageTimeout来避免出现死锁。

    7 BroadcastSystemMessage

    我们一般所接触到的消息都是发送给窗口的, 其实, 消息的接收者可以是多种多样的,它可以是应用程序(applications), 可安装驱动(installable drivers), 网络设备(network drivers), 系统级设备驱动(system-level device drivers)等,

    BroadcastSystemMessage这个API可以对以上系统组件发送消息。

    那么这些消息是怎样传送的呢。我们以MFC为例来看一下消息传送过程。

    四、MFC消息机制

    在Windows应用程序的主函数中,首先要注册窗口类,然后创建并显示窗口。创建窗口后程序就进入消息循环,在消息循环中,程序不断地获得消息并将消息派送给对应的窗口函数进行处理。

    我们可以看到,在MFC的框架结构下,可以进行消息处理的类的头文件里面
    都会含有DECLARE_MESSAGE_MAP()宏,这里主要进行消息映射和消息处理函数的声
    明。可以进行消息处理的类的实现文件里一般都含有如下的结构。

    BEGIN_MESSAGE_MAP(CInheritClass, CBaseClass) //{{AFX_MSG_MAP(CInheritClass)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    这里主要进行消息映射的实现和消息处理函数的实现。

    所有能够进行消息处理的类都是基于CCmdTarget类的,也就是说CCmdTarget
    类是所有可以进行消息处理类的父类。CCmdTarget类是MFC处理命令消息的基础和核心。

    同时MFC定义了下面的两个主要结构:
    AFX_MSGMAP_ENTRY
    struct AFX_MSGMAP_ENTRY
    {//“““//

    };

    和AFX_MSGMAP

    struct AFX_MSGMAP

    {//“““`//
    };

    其中AFX_MSGMAP_ENTRY结构包含了一个消息的所有相关信息, 而AFX_MSGMAP主要作用是两个,一:用来得到基类的消息映射入口地址。二:得到本身的消息映射入口地址。

    实际上,MFC把所有的消息一条条填入到AFX_MSGMAP_ENTRY结构中去,形成一个数组,该数组存放了所有的消息和与它们相关的消息的参数。同时通过AFX_MSGMAP能得到该数组的首地址,同时也得到基类的消息映射入口地址,这是为例当本身对该消息不响应的时候,就调用其基类的消息响应。

    现在我们来分析MFC是如何让窗口过程来处理消息的,实际上所有MFC的窗口类都通过钩子函数_AfxCbtFilterHook截获消息,并且在钩子函数_AfxCbtFilterHook中把窗口过程设定为AfxWndProc。原来的窗口过程保存在成员变量m_pfnSuper中

    1.MFC框架下,接收处理来自Windows消息的过程:

    2.MFC内部消息处理方式

    MFC接收一个寄送的消息:

    MFC处理一个寄送和发送消息的惟一明显不同是寄送的消息要做应用程序的消息队列中花费一些时间。在消息泵(message pump)弹出它之前,它要一直在队列中。下面是怎样接受寄送消息的过程。MFC应用程序中的消息泵在CWinApp的成员函数Run()中。应用程序开始运行时,Run()就被调用,Run()把时间分割成两部分。一部分用来执行后台处理,如取消临时CWnd对象;另一部分用来检查消息队列。当一个新的消息进来时,Run()抽取它—即用GetMessage( )从队列中取出该消息,运行PreTranslateMessage( )和::TranslateMessage( )两个消息翻译函数,然后用DispatchMessage( )函数调用该消息预期的目标窗口进程。如下图。

    我们用一个实例函数A发送消息到函数B的过程来看一下MFC内部消息处理过程。

    1. 首先函数A应获取消息的CWnd类对象的指针,然后,调用CWnd的成员函数SendMessage()。

    LRESULT Res=pWnd->SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam);

    pWnd指针指向目标CWnd类对象。变量Msg是消息,wParam和lParam变量包含消息的参数,如鼠标单单击哪里或选择了什么菜单项。目标窗口返回的消息结果放在变量Res中。

    发送消息到一个没有CWnd的函数对象的窗口,可以用下列目标窗口的句柄直接调用Windows API:

    LRESULT Res=::SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    这里的hWnd是目标窗口的句柄。

    如果是异步传输也可使用PostMessage(),消息同上相同,但返回值Res不一样,Res不是一个由目标窗体返回的值,而是一个布尔值,用来表示消息是否成功的放到消息队列中。

    2. 正常情况下,一旦消息被发送后,应用程序后台会自动的将它发送,但是在特殊情况下,需要你自己去删除一个消息,例如想在应用程序接收到某种消息之前停止应用程序。有两种方法可以从应用程序消息队列中删除一个消息,但这两种方法都没有涉及MFC。

    第一种方法:在不干扰任何事情之下窥视消息队列,看看一个消息是否在那里。
    BOOL res=::PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ) ;
    第二种方法:实际上是等待,一直等到一个新的消息到达队列为止,然后删除并返回该消息。
    BOOL res=::GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
    在这两种方法中,变量hWnd指定要截获消息的窗口,如果该变量设为NULL,所有窗口消息将被截获。wMsgFilterMin和wMsgFilterMax变量与SendMessage( )中的变量Msg相对应,指定查看消息的范围。如果用“0,0〃,则所有的消息都将被截获。如果用WM_KEYFIRST,WM_KEYLAST或WM_MOUSEFIRST,WM_MOUSELAST,则所有键盘或鼠标的消息将被截获。wRemoveMsg变量指定PeekMessage( )是否应该真正地从队列中删除该消息。(GetMessage( )总是删除消息)。该变量可以取两个值:
    PM_REMOVE,PeekMessage( )将删除消息。
    PM_NOREMOVE,PeekMessage( )将把消息留在队列里,并返回它的一个拷贝。
    当然,如果把消息留在消息队列中,然后再次调用PeekMessage( )查看相同类型的消息,则将返回完全相同的消息。
    lpMsg变量是一个指向MSG结构的指针,MSG包含检索到的消息。
    typedef struct tagMSG {
    HWND hwnd; // window handle message is intended for
    UINT message;
    WPARAM wParam;
    LPARAM lParam;
    DWORD time; // the time the message was put in the queue
    POINT pt; // the location of the mouse cursor when the
    // message was put in the queue
    } MSG;

    3. 消息会到消息队列中。CwinApp的成员函数Run,在应用程序运行时,Run就把时间分割成两部分,一部分执行后台的处理,另一部分来检查消息的队列,当发现新消息时,Run就调用GetMessage()从队列消息中取出该消息。

    3.运行两个消息翻译函数PreTranslateMessage()和::TranslateMessage(),进行翻译。主要找到函数对象的位置、消息的动作标识和跟消息相关的执行操作。

    4.用DispatchMessage()函数调用该消息预期的函数B进程,进行执行。

    转载于:https://www.cnblogs.com/dongfangbubai/p/sendmessage.html

    展开全文
  • C#调用SendMessage 用法

    2016-03-01 18:51:00
    函数功能:该函数将指定的消息发送到一个或多个窗口。... 函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);  参数:  hWnd:其窗口程序将接收消息的窗口的句柄。如...

    函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。该函数是应用程序和应用程序之间进行消息传递的主要手段之一。
        函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

        参数:

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

        Msg:指定被发送的消息。

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

        IParam:指定附加的消息指定信息。

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

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

        如果指定的窗口是由调用线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。

    C#中使用该函数首先导入命名空间:
    using System.Runtime.InteropServices;

    然后写API引用部分的代码,放入 class 内部
    [DllImport("user32.dll", EntryPoint = "SendMessage")]
    private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

    这个函数有四个参数,第一个是窗口句柄,窗口可以是任何类型的屏幕对象;第二个是用于区别其他消息的常量值;第三个通常是一个与消息有关的常量值,也可能是窗口或控件的句柄,第三个参数是可选参数,有的消息要,有的不需要,比如单击就不需要这个参数,
    别的消息,比如鼠标移动的可能需要在这里加上一些鼠标的参数;第四个通常是一个指向内存中数据的指针。在C#中消息需要定义成windows系统中的原始的16进制数字,比如 const int WM_Lbutton = 0x201; //定义了鼠标的左键点击消息。详细值在最后。

    例如:

    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;   
    //当系统将要进入暂停状态时发送此消息   
    const int WM_POWER = 0x48;   
    //当一个应用程序传递数据给另一个应用程序时发送此消息   
    const int WM_COPYDATA = 0x4A;   
    //当某个用户取消程序日志激活状态,提交此消息给程序   
    const int WM_CANCELJOURNA = 0x4B;   
    //当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口    
    const int WM_NOTIFY = 0x4E;   
    //当用户选择某种输入语言,或输入语言的热键改变   
    const int WM_INPUTLANGCHANGEREQUEST = 0x50;   
    //当平台现场已经被改变后发送此消息给受影响的最顶级窗口   
    const int WM_INPUTLANGCHANGE = 0x51;   
    //当程序已经初始化windows帮助例程时发送此消息给应用程序   
    const int WM_TCARD = 0x52;   
    //此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果//当前都没有焦点,就把此消息发送给//当前激活的窗口   
    const int WM_HELP = 0x53;   
    //当用户已经登入或退出后发送此消息给所有的窗口,//当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息   
    const int WM_USERCHANGED = 0x54;   
    //公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构   
    const int WM_NOTIFYFORMAT = 0x55;   
    //当用户某个窗口中点击了一下右键就发送此消息给这个窗口   
    //const int WM_CONTEXTMENU = ??;   
    //当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口   
    const int WM_STYLECHANGING = 0x7C;   
    //当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口   
    const int WM_STYLECHANGED = 0x7D;   
    //当显示器的分辨率改变后发送此消息给所有的窗口   
    const int WM_DISPLAYCHANGE = 0x7E;   
    //此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄   
    const int WM_GETICON = 0x7F;   
    //程序发送此消息让一个新的大图标或小图标与某个窗口关联   
    const int WM_SETICON = 0x80;   
    //当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送   
    const int WM_NCCREATE = 0x81;   
    //此消息通知某个窗口,非客户区正在销毁    
    const int WM_NCDESTROY = 0x82;   
    //当某个窗口的客户区域必须被核算时发送此消息   
    const int WM_NCCALCSIZE = 0x83;   
    //移动鼠标,按住或释放鼠标时发生   
    const int WM_NCHITTEST = 0x84;   
    //程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时   
    const int WM_NCPAINT = 0x85;   
    //此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态   
    const int WM_NCACTIVATE = 0x86;   
    //发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件通过应   
    const int WM_GETDLGCODE = 0x87;   
    //当光标在一个窗口的非客户区内移动时发送此消息给这个窗口 非客户区为:窗体的标题栏及窗 的边框体   
    const int WM_NCMOUSEMOVE = 0xA0;   
    //当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息   
    const int WM_NCLBUTTONDOWN = 0xA1;   
    //当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息    
    const int WM_NCLBUTTONUP = 0xA2;   
    //当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息   
    const int WM_NCLBUTTONDBLCLK = 0xA3;   
    //当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息   
    const int WM_NCRBUTTONDOWN = 0xA4;   
    //当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息   
    const int WM_NCRBUTTONUP = 0xA5;   
    //当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息   
    const int WM_NCRBUTTONDBLCLK = 0xA6;   
    //当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息   
    const int WM_NCMBUTTONDOWN = 0xA7;   
    //当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息   
    const int WM_NCMBUTTONUP = 0xA8;   
    //当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息   
    const int WM_NCMBUTTONDBLCLK = 0xA9;   
    //WM_KEYDOWN 按下一个键   
    const int WM_KEYDOWN = 0x0100;   
    //释放一个键   
    const int WM_KEYUP = 0x0101;   
    //按下某键,并已发出WM_KEYDOWN, WM_KEYUP消息   
    const int WM_CHAR = 0x102;   
    //当用translatemessage函数翻译WM_KEYUP消息时发送此消息给拥有焦点的窗口   
    const int WM_DEADCHAR = 0x103;   
    //当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口   
    const int WM_SYSKEYDOWN = 0x104;   
    //当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口   
    const int WM_SYSKEYUP = 0x105;   
    //当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口   
    const int WM_SYSCHAR = 0x106;   
    //当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口   
    const int WM_SYSDEADCHAR = 0x107;   
    //在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务   
    const int WM_INITDIALOG = 0x110;   
    //当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译   
    const int WM_COMMAND = 0x111;   
    //当用户选择窗口菜单的一条命令或//当用户选择最大化或最小化时那个窗口会收到此消息   
    const int WM_SYSCOMMAND = 0x112;   
    //发生了定时器事件   
    const int WM_TIMER = 0x113;   
    //当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件   
    const int WM_HSCROLL = 0x114;   
    //当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件   
    const int WM_VSCROLL = 0x115;   
    //当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单   
    const int WM_INITMENU = 0x116;   
    //当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部   
    const int WM_INITMENUPOPUP = 0x117;   
    //当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)   
    const int WM_MENUSELECT = 0x11F;   
    //当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者   
    const int WM_MENUCHAR = 0x120;   
    //当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待   
    const int WM_ENTERIDLE = 0x121;   
    //在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色   
    const int WM_CTLCOLORMSGBOX = 0x132;   
    //当一个编辑型控件将要被绘制时发送此消息给它的父窗口通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色   
    const int WM_CTLCOLOREDIT = 0x133;   
      
    //当一个列表框控件将要被绘制前发送此消息给它的父窗口通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色   
    const int WM_CTLCOLORLISTBOX = 0x134;   
    //当一个按钮控件将要被绘制时发送此消息给它的父窗口通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色   
    const int WM_CTLCOLORBTN = 0x135;   
    //当一个对话框控件将要被绘制前发送此消息给它的父窗口通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色   
    const int WM_CTLCOLORDLG = 0x136;   
    //当一个滚动条控件将要被绘制时发送此消息给它的父窗口通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色   
    const int WM_CTLCOLORSCROLLBAR = 0x137;   
    //当一个静态控件将要被绘制时发送此消息给它的父窗口通过响应这条消息,所有者窗口可以 通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色   
    const int WM_CTLCOLORSTATIC = 0x138;   
    //当鼠标轮子转动时发送此消息个当前有焦点的控件   
    const int WM_MOUSEWHEEL = 0x20A;   
    //双击鼠标中键   
    const int WM_MBUTTONDBLCLK = 0x209;   
    //释放鼠标中键   
    const int WM_MBUTTONUP = 0x208;   
    //移动鼠标时发生,同WM_MOUSEFIRST   
    const int WM_MOUSEMOVE = 0x200;   
    //按下鼠标左键   
    const int WM_LBUTTONDOWN = 0x201;   
    //释放鼠标左键   
    const int WM_LBUTTONUP = 0x202;   
    //双击鼠标左键   
    const int WM_LBUTTONDBLCLK = 0x203;   
    //按下鼠标右键   
    const int WM_RBUTTONDOWN = 0x204;   
    //释放鼠标右键   
    const int WM_RBUTTONUP = 0x205;   
    //双击鼠标右键   
    const int WM_RBUTTONDBLCLK = 0x206;   
    //按下鼠标中键   
    const int WM_MBUTTONDOWN = 0x207;   
      
    const int WM_USER = 0x0400;   
    const int MK_LBUTTON = 0x0001;   
    const int MK_RBUTTON = 0x0002;   
    const int MK_SHIFT = 0x0004;   
    const int MK_CONTROL = 0x0008;   
    const int MK_MBUTTON = 0x0010;   
    const int MK_XBUTTON1 = 0x0020;   
    const int MK_XBUTTON2 = 0x0040;

    http://www.cnblogs.com/sosoft/

    展开全文
  • SendMessage和PostMessage

    千次阅读 2016-02-10 18:50:10
    首先简单从字面区分一下: ...而在消息机制中,就是说,系统(邮寄员)会将收到的消息(邮局分发)直接发送到某个窗口的窗口过程(收件人),并且需要该窗口作出处理(收件人签字)才返回,这就是SendMessage  

    首先简单从字面区分一下:

    Send与Post这两个英文单词的意思:Send有发送的意思,而Post具有投寄的意思。

          Send:  相当于邮寄员,会将快件亲手交给收件人,并且需要收件人签字,他才闪人。而在消息机制中,就是说,系统(邮寄员)会将收到的消息(邮局分发)直接发送到某个窗口的窗口过程(收件人),并且需要该窗口作出处理(收件人签字)才返回,这就是SendMessage
          Post:  相当于邮局、邮筒等等,我们写好信,会将信交给邮局,或投寄到邮筒里,而什么时候发送,发送到哪里都由邮局来处理,我们投寄信件的时候,是不会等候这封信件到达收件人手里,然后才回家的。 而在消息机制中,就是说,系统(我们)将收到的消息(信件)投寄到应用程序的消息循环(相当于邮筒)中,然后就闪人,具体啥时候处理这条消息(啥时候发送邮件),那就得看“办事效率”了。
          区别很明显,SendMessage的消息是不进队列的,而PostMessage的需要排队。 
          值得说明的是:虽然一个要进队,一个不进队,但是最终处理消息的地方都一样:都是系统调用窗口过程进行处理(收件人作出反应)

    然后详细看一下具体的细节部分:

    Win32 API消息函数:SendMessage

    函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程 序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。

          函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

          参数:

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

          Msg:指定被发送的消息。
          wParam:指定附加的消息指定信息。
          IParam:指定附加的消息指定信息。
          返回值:返回值指定消息处理的结果,依赖于所发送的消息。
          备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消 息。
          如果指定的窗口是由调用线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间 的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。
          Windows CE:Windows CE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前,要检查发送的消息是否被支持。
          速查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。

    Win32 API消息函数: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方式实现。

    在控制别的应用程序的时候,经常需要等待直到某个功能结束,例如:
    打开一个窗口-->等待直到窗口结束
    这 个时候就可以用到SendMessage
    如果在打开这个窗口后仍然需要对该窗口的界面进行设置,比如Edit的value等等,比如:
    打 开一个窗口-->控制窗口的control的属性
    这个时候就需要PostMessage

    使用一个钩子程序截获消息后,使用 SendMessage把消息发送到主处理程序进行处理,但是在主处理程序还没有完成任务的时候,被设置钩子的程序进入了停止的状态,不可以处理
    WM_PAINT,
    WM_MOVE,
    ....... 等的基本信息,
    必须要等SendMessage发送出的消息完成后,才能继续运行,整个界面一片空白,把钩子消息设置成PostMessage的 发送消息形式后,问题解决!
    我查了MSDN对这两个API的定义,
    PostMessage只是把消息放入队列,不管其他程序是否处理都返 回,然后继续执行;
    而SendMessage必须等待其他程序处理消息后才返回,继续执行。
    PostMessage的返回值表示 PostMessage函数执行是否正确;
    而SendMessage的返回值表示其他程序处理消息后的返回值。 
    使用这两个发送消息函数 的最重要的是要看你的程序是否要对消息的滞后性关注否,PostMessage会造成消息的滞后性,而SendMessage则不会,但如果 SendMessage消息处理失败,则会造成程序停止!

    ========================================================================================================

    1. SendMessage函数要等到消息被处理后才返回

        PostMessage 消息发出后马上返回

    2. PostMessage发向目标窗口的消息一定会进入消息队列

        SendMessage向同一线程的窗口发消息,不会进入消息队列,

        SendMessage向其他线程的窗口发消息,则会进入消息队列,

    3. PostMessage的返回值表示PostMessage函数执行是否正确,

       SendMessage的返回值表示其他程序处理消息后的返回值

    1、SendMessage()和PostMessage().这两个函数几乎是一样的,它们的区别是: 

    SendMessage()直接把一个消息发给窗口过程,等消息被处理后才返回。Postmessage()只是把消息发送到消息队列,完成后即返回。

    2.1、当调用SendMessage时,接收消息的线程的QS_SENDMESSAGE标志被设置,系统调用相应的窗口过程来处理这个消息。 GetMessage和PeekMessage函数在内部进行这种处理。如果在“发送消息队列”中没有消息了,QS_SENDMESSAGE标志就被关 闭。“发送消息队列”中可能有几个Send过来的消息。例如,几个线程同时向一个窗口发送消息。

    2.2、当调用PostMessage时,函数GetMessage或PeekMessage填充传递给它们的Msg结构,函数返回。再调用 DispatchMessage,让相应的窗口过程来处理消息。

    2.3、当调用SendMessage时,发送线程和接收线程是同一个线程的时候,SendMessag很简单,只是调用指定窗口的窗口过程。但当 发送线程和接收线程不是同一个线程时,麻烦就大了。因为发送线程和接收线程运行在不同的地址空间中,因此不能访问接受线程中相应窗口过程的代码和数据。其 实这时发送线程要挂起,当接收线程处理Send过来的消息时,发送线程被设置为空闲(idle)状态。在发送的消息处理完成后,窗口过程的返回值被登记到 发送线程的应答消息队列中。发送线程被唤醒,取出包含在应答消息队列中的返回值。这个返回值就是调用SendMessage的返回值,这时,发送线程继续 运行。

    2.4、WM_PAINT和WM_TIMER这两个消息的优先级非常低,最低的是WM_TIMER。

    2.5、WM_COPYDATA只能Send,不能Post。

    ========================================================================================================

    吕鑫老师介绍的这两个函数部分:

    1、SendMessage和PostMessage函数的功能

    a)能够向指定的窗口发送窗口消息,既可以是本进程内窗口也可以是其他进程的;

    b)既可以发送系统内部消息,消息编号的范围是1~WM_USER-1;

    例如:WM_LBUTTONDOW,WM_MOUSEMOVE等;

    c)也可以发送非系统消息(开发者定义的消息),范围是WM_USER-0x7FFF。

    2、两者的区别:

    a)SendMessage是阻塞型函数,PostMessage是非阻塞型函数;

    SendMessage用于调用指定窗口的内部程序,直到窗口程序处理完成以后再返回;

    PostMessage是将消息寄送到一个窗口内的消息队列后就立即返回。

    b)两个函数的返回值不同;

    LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

    B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

    SendMessage的返回值依赖于消息处理函数。

    c)跨线程或跨进程发送消息,推荐使用PostMessage函数。

    展开全文
  • SendMessage(ptr, WM_RBUTTONDOWN, 0x01, makelong(302, 434));  Thread.Sleep(100);  SendMessage(ptr, WM_RBUTTONUP, 0, makelong(302, 434)); 效果如下: <p><img alt="" height="266" src...
  • 试了下sendmessage发送按键。结果不行。必须先用SetForegroundWindow激活窗口,获得焦点。才可以发送成功。 搜下百度上面,有说第二个参数给245,有说给258的。但是试了下都不行。 哪位大神有办法? 代码原型...
  • Win32程序SendMessage使用笔记

    千次阅读 2019-02-20 11:16:41
    1.改变控件内TEXT内容 SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)TEXT(&quot;1234&quot;)); 2.改变窗体字体样式 SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, NULL);
  • SendMessage与PostMessage

    2012-04-26 18:04:00
    现在回过头来回想消息机制时,对SendMessage与PostMessage的区别与联系仍然是懵懵懂懂的。有些时候分不清到底是哪个发送消息后会立即返回。 因此,特别在这些记录一下,以备不时不需: 1、消息结构体: 1typedef ...
  • Send有发送的意思,而Post具有投寄的意思。 联想一下现实生活中我们写信(很久很久以前。。。。)来记就很简单了: Send: 相当于邮寄员,他会将快件亲手交给收件人,并且需要收件... 这东东就是SendMessage。 Post...
  • SendMessage 发送组合键

    2015-06-22 14:43:16
    我想用SendMessage 发送组合键,网上找了好久说的都是同一个方法,我这里试了,程序没有反应,求大神指点! 网上的代码:http://blog.sina.com.cn/s/blog_4ba5666e0101ah6o.html
  • //PostMessage会立即返回 //PostMessage(hwndDlg,WM_SIZE,0,0); //OutputDebugString(TEXT("Post...如果消息一直没有执行完毕,SendMessage不会返回,会造成当前执行SendMessage线程无线等待,卡死状态 //SendMessage
  • 遇到android Handler.sendMessage的一个坑

    千次阅读 2018-07-18 10:12:14
    今天遇到一个android app bug,最后发现copy代码时犯了个错 对同一message调用了两次sendMessage { String msg= "event=CarDetected\r\n" +"car=test"+"\r\n" +"\r\n...
  • SendMessage PostMessage
  • sendmessage用不了

    2013-01-18 18:51:09
    我想现实的功能是把MEMO中的文本.一行一行的弄到记事本里 但是每次执行都盖掉了原来的文本.怎么让他们实现自动换行并不盖掉原来的内容 ...sendmessage(windows,WM_CHAR,13,0) //为什么一点反应也没有.句柄没有错
  • 标题使用sendmessage发送string的注意事项 使用SendMessage,原本以为很简单的事,却处处碰壁。 此网站有详细说明 https://www.cnblogs.com/hb01846/p/10952036.html ...函数功能:该函数将指定的消息发送到一个或多个...
  • SendMessage到浏览器焦点输入框没有作用? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiAPI/html/delphi_20061115123755228.html 使用SendMessage(GetFocus,WM_SETTEXT,0,longint(PChar('123456'))); ...
  • MFC SendMessage小bug记录

    2018-09-17 11:55:37
    SendMessage已经返回,但是响应函数任何反应 测试过程: 1.发送自定以消息改为发送WM_SYSCOMMAND,wParam改为原来的消息值, void videoDialog::OnSysCommand(UINT nID, LPARAM lParam) OnSysCommand中...
  • C#使用win32 api sendmessage怎么发送鼠标消息到窗体? 可以确定窗体可以接收并处理sendmessage的键盘...不只一个程序不能用,很多程序(包括记事本)都不会处理,一定是我的sendmessage鼠标写对,请大神救救孩子吧!
  • SendMessage(formh, WM_MOUSEMOVE,MK_LBUTTON,MAKELPARAM(321,477)); sleep(500); SendMessage(formh, WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(321,477)); sleep(500); SendMessage(formh, WM_LBUTTONUP,MK_LBUTTON...
  • void TcpServer::sendMessage() //开始发送数据 { ui->serverSendBtn->setEnabled(false); clientConnection = tcpServer->nextPendingConnection(); connect(clientConnection,SIGNAL(bytesWritten(qint64))...
  • 1.下面我要实现的功能: 1.VS2010 基于对话框的操作; 2.两个对话框CMessageDlg和ConeDlg; 3.CMessageDlg为父窗口,ConeDlg为子窗口; 4.父窗口上有一个按钮用于弹出子窗口,子窗口也有一个按钮用来触发事件;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,834
精华内容 1,533
关键字:

sendmessage没反应