Windows操作系统基于消息驱动的架构,应用程序不能主动读取键盘或鼠标的状态,而是依赖系统发送的消息。当用户按下或移动键盘或鼠标时,系统会发送相应消息(如WM_KEYDOWN、WM_MOUSEMOVE等)通知窗口。这些消息由系统预定义,并通过宏定义如WM_PAINT、WM_LBUTTONDOWN等标识。
输入焦点是决定键盘和鼠标消息接收者的关键技术。当某个窗口获得输入焦点时,它会位于屏幕最前端,颜色也会改变,所有输入都会导向这个窗口,使其成为活动窗口。通常,鼠标点击会使得窗口获得输入焦点,而程序也可以通过CWnd::SetFocus()函数手动指定焦点。
失去输入焦点的窗口会收到WM_KILLFOCUS消息,而获得焦点的窗口则会收到WM_SETFOCUS消息。每个窗口都有响应这些消息的函数,如OnKillFocus()和OnSetFocus(),参数分别为新焦点和旧焦点窗口的指针。
系统定义了多种消息,包括标准的Windows消息,如键盘事件(如WM_KEYDOWN、WM_CHAR、WM_KEYUP)和鼠标事件(如WM_MOUSEMOVE、WM_LBUTTONDOWN)。非系统键按下时发送WM_KEYDOWN,释放时发送WM_KEYUP,而WM_CHAR则传递用户输入的ASCII字符。
键盘按键的处理更为复杂,除了ASCII字符外,还包括系统键的特殊处理,如ALT+F4关闭窗口。Windows使用虚拟键码(如VK_A、VK_ESC)来表示所有按键,即使在硬件上找不到。鼠标消息如WM_MOUSEMOVE会在鼠标移动时发送,左键按下和释放则对应WM_LBUTTONDOWN和WM_LBUTTONUP。
Windows的消息机制包括一个或多个消息队列,消息按接收窗口的句柄发送。16位系统采用协同式多任务,而32位系统支持抢先式多任务,允许系统在多个任务间切换,提高了效率。通过消息循环,程序能高效处理用户输入和系统事件。
在Windows中发生的一切都可以用消息来表示,消息用于告诉操作系统发生了什么,所有的Windows应用程序都是消息驱动的。 一个消息是由消息的名称(UINT)和两个参数(WPARAM, LPARAM)组成。消息的参数中包含有重要的信息。例如对鼠标消息而言,LPARAM中一般包含鼠标的位置信息,而WPARAM参数中包含了发生该消息时,SHIFT、CTRL等键的状态信息,对于不同的消息类型来说,两个参数也都相应地具有明确意义。
消息机制消息与输入焦点
输入焦点是决定键盘和鼠标消息接收者的关键技术。当某个窗口获得输入焦点时,它会位于屏幕最前端,颜色也会改变,所有输入都会导向这个窗口,使其成为活动窗口。通常,鼠标点击会使得窗口获得输入焦点,而程序也可以通过CWnd::SetFocus()函数手动指定焦点。失去输入焦点的窗口会收到WM_KILLFOCUS消息,而获得焦...
消息机制的输入焦点
如果某个窗口的输入焦点被抢走,Windows系统就会发出WM_KILLFOCUS消息给这个失去输入焦点的窗口,同时还会告诉该窗口下一个取得输入焦点的窗口的指针。而获得输入焦点的窗口则会收到WM_SETFOCUS消息。消息响应函数分别为:afx_msg void OnKillFocus(CWnd* pNewWnd);其中的参数为得到输入焦点的窗口的指针。Afx...
windows 消息机制
窗口是Windows可视化交互的核心,每个窗口在其所属线程内维护消息队列,确保线程间的同步。消息分为系统定义消息(如窗口操作、命令响应和通知)和应用自定义消息,其中系统消息(如键盘、鼠标事件)先入队列,非队列消息(如激活或焦点改变)则直接发送到目标窗口。发送消息的方式有PostMessage、PostThreadMessage...
Delphi的消息处理[2]
前面我们提到的消息都是标准的Windows消息(WM_X) 除此之外还有VCL内部消息 通知消息和用户自定义消息 VCL内部消息通常以 CM_ 开头 用于管理VCL内部的事物 如果改变了某个属性值或组件的其他一些特性后 需要通过内部消息将该变化通知其他组件 例如 激活输入焦点消息是向被激活的或被停用的组件发送的 用于...
VB Postmessage发送字符串问题
任何应用程序窗口发送模拟的关键,必须先获得输入焦点,要接收的关键不需要激活该应用程序的窗口句柄,以便使用Windows API的查找窗口FindWindowEx,首先FindWindow顶部的应用程序(顶层)的窗口句柄,然后使用FindWindowEx得到你想要领取钥匙的子窗口或控制的句柄,因为顶层窗口的应用程序不一定是关键的是接受窗口(...
MQ是什么?
与消息队列的通信概念有着本质区别。最后,MQ在计算机科学中还有可能是乘商寄存器的缩写,它是运算器中的关键组件,负责数据的乘法和除法运算。然而,这与本文的焦点——消息队列并无直接关联。综上,MQ是一个多功能且广泛应用于通信和计算领域的技术概念,但其具体含义根据上下文会有所不同。
如何在VB中用PostMessage向指定窗口发送带有修饰键的组合键?
要实现向任意应用程序窗口发送模拟的按键,在不需激活该应用程序使其获得输入焦点的情况下,首先必须取得要接收按键的窗口句柄,这要用到Windows API FindWindow 及 FindWindowEx,首先用 FindWindow 取得应用程序顶层(Top Level)窗口的句柄,然后再用 FindWindowEx 取得要接收按键的子窗口或控件的句柄,因为...
CToolBarCtrl消息处理
在定制过程中的每一步,工具条控件都向父窗口发送通知消息。如果用户按住SHIFT键并开始拖动一个按钮,则工具条自动处理这个拖动操作。工具条发送TBN_QUERYDELETE通知消息给父窗口,以确定是否应该删除该按钮。如果父窗口返回FALSE,则这个拖动操作结束。否则,工具条捕捉鼠标输入并等待用户释放鼠标按钮。 当用户释放鼠标按钮时...
易语言里的发送信息命令里的信息值,参数1,参数2分别是什么意思。代表什...
发送消息 (发送按钮句柄, 245, 0, 0)14.删除 控件.发送信息 (768, 0, 0)15.剪切 控件.发送信息 (771, 0, 0)16.撤销 控件.发送信息 (772, 0, 0)17.退出 控件.发送信息(1,0,0)18.获得焦点 控件.发送信息(7,0,0)19.失去焦点 控件.发送信息(8,0,0)20.结束 控件.发送信息(25,0...
vb中SetWindowsHookEx详细用法及举例
4. 设置输入焦点事件; 5. 同步系统消息队列事件。 Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。 3、WH_DEBUG Hook 在系统调用系统中与其他Hook关联的Hook子程之前,系统会调用WH_DEBUG Hook子程。你可以使用这个Hook来决定是否允许系统调用与其他Hook关联的Hook子程。 4、WH_FOREGROUNDIDLE Hook 当...