怎么用win32的消息处理函数实现快捷键的功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用win32的消息处理函数实现快捷键的功能相关的知识,希望对你有一定的参考价值。

参考技术A Win32程序主消息循环的标准写法是:
while
(GetMessage(&msg,
NULL,
0,
0))

TranslateMessage(&msg);
DispatchMessage(&msg);

首先使用
GetMessage()
函数获取消息,然后用TranslateMessage()函数转化消息,这样做的目的是,获取一些按键消息(虚拟键如ESC、Ctrl、Atl、箭头等等)转化为ASCll字符的键产生WM_CHAR消息(这样系统才可以识别),DispatchMessage再将消息转发给系统。
比如:VK_RETURN
回车键对应的ASCll字符为0x0D
VK_RETURN
就是虚拟键消息,0x0D就是字符消息
连续调用的目的就是使你的程序一直在消息循环中,因为Windows程序运行的机制就是基于消息循环的,没有了消息循环程序就不能相应对它的操作了。
补充:
WNDCLASS结构的第一个成员style表示窗口类的风格,它往往是由一些基本的风格通过位的“或”操作(操作符位“|”)组合而成。以下列出了一些常用的基本窗口风格:
CS_HREDRAW
如果窗口客户区宽度发生改变,重绘整个窗口
CS_VREDRAW
如果窗口客户区高度发生改变,重绘整个窗口
CS_DBLCLKS
能感受用户在窗口中的双击消息
CS_NOCLOSE
禁用系统菜单中的“关闭”命令
CS_OWNDC
为该窗口类的各窗口分配各自独立的设备环境
CS_CLASSDC
为该窗口类的各窗口分配一个共享的设备环境
CS_PARENTDC
指定子窗口继承其父窗口的设备环境
CS_SAVEBITS
把被窗口遮掩的屏幕图象部分作为位图保存起来。当该窗口被移动时,Windows使用被保存的位图来重建屏幕图象
CS_CLASSDC就表示为该窗口类的各窗口分配一个共享的设备环境

在 Qt 中寻找 PostMessage 功能

【中文标题】在 Qt 中寻找 PostMessage 功能【英文标题】:Looking for PostMessage functionality in Qt 【发布时间】:2010-10-14 20:13:14 【问题描述】:

Win32 API 有一个 PostMessage 函数,它将消息发布到 GUI 消息队列的末尾,以便稍后从 GUI 线程处理,而 SendMessage 则与调用线程同步发送和处理消息.

PostMessage 功能是否有 Qt 解决方案?一位同事建议 Qt 的服务器/套接字实现可以提供它;这是一个合理的方法吗?

【问题讨论】:

【参考方案1】:

检查QCoreApplication::postEvent()。

【讨论】:

我接受这个答案,因为它非常模仿PostMessage,这是我问的。但是,我决定使用 jkerian 的解决方案 (QTimer::singleShot),因为它更适合 Qt 的信号/插槽。谢谢你们!【参考方案2】:

看看QTimer::singleShot。在您的情况下,您希望将其与 msec0 一起使用,它应该提供相同的功能。 (这通常用于实现延迟初始化,直到 GUI 事件循环运行)

【讨论】:

【参考方案3】:

类似于 QTimer 解决方案,但具有可以传递参数的优点,是 QMetaObject::invokeMethod 方式:

 QString SomeClass::compute(const QString&, int, double);
 ...
 QMetaObject::invokeMethod(obj, "compute", Qt::QueuedConnection,
                       Q_RETURN_ARG(QString, retVal),
                       Q_ARG(QString, "sqrt"),
                       Q_ARG(int, 42),
                       Q_ARG(double, 9.7));

QueuedConnection 在事件循环中排队,DirectConnection 会立即执行。

【讨论】:

【参考方案4】:

到目前为止,所有答案都很好,我只想补充一点,您还可以使用connect()Qt::QueuedConnection 作为连接类型。

【讨论】:

以上是关于怎么用win32的消息处理函数实现快捷键的功能的主要内容,如果未能解决你的问题,请参考以下文章

请教一个利用pywin32向特定窗口发送键盘消息的问题

如何在win32里面设置一个计时器?

一个有用的Win32消息处理宏HANDLE_MSG

Win32 API是啥啊?怎么用?

怎么使通过进程打开的win32程序窗口始终置顶

C# 编写 Windows 动态桌面软件实现之桌面交互功能