medic17 Asked: 2020-01-23 19:27:19 +0800 CST2020-01-23 19:27:19 +0800 CST 2020-01-23 19:27:19 +0800 CST windows如何监听系统热键? 772 对于我正在做的一个项目。我想知道,Windows 10 如何监听系统热键?后台有系统服务在做吗? 通过系统热键,我的意思是Alt+F4和类似的。 windows winapi 2 个回答 Voted Best Answer Sam Forbis 2020-01-23T19:57:08+08:002020-01-23T19:57:08+08:00 当按下某个键时,Windows 内核从键盘驱动程序接收消息并将其添加到系统消息队列中。这些消息被发送到机器上所有正在运行的程序,包括处理热键按下的程序。 关于哪些程序处理哪些组合键的文档很少,但可以肯定的是,您可能在任务管理器中看到的 Windows 资源管理器、“Windows 会话管理器”或“Shell 基础结构主机”应用程序负责处理这些组合键。 例如,打开“运行”的Win+组合由 Windows 资源管理器处理。R如果您从任务管理器中关闭 Windows 资源管理器,然后尝试使用该组合,它将不起作用。会话管理器或 shell 基础结构主机可能会处理更多的低级组合,例如Alt+ 。F4 因此,没有一个程序可以处理所有的组合键。它混合了几个预安装的 Windows 应用程序。例如,Windows 资源管理器负责您 PC 上的大部分 GUI,并处理大量这些组合键。 编辑:桌面窗口管理器似乎是处理Alt+等组合键的管理器F4。 Mark 2020-01-23T20:14:01+08:002020-01-23T20:14:01+08:00 请参阅https://docs.microsoft.com/en-us/windows/win32/menurc/wm-syscommand和 wm_command。 这些键在核心 Windows UI dll、user32.dll 中处理。 这是来自编辑器的帮助,解释了特定文本编辑器的编程方式。 Windows 程序的结构 Windows 提供了大量作为窗口实现的控件。该程序使用模仿编辑窗口(记事本使用)的 RichEdit 窗口。这为我们提供了类似 Word 的编辑能力,同时仍将其保留为文本。 子主 程序启动并注册它将使用的窗口 (RegisterWindowsEx)。然后它创建窗口和任何子窗口,包括内置控件 (CreateWindowEx)。 它创建菜单和加速键。 它为主窗口和 RichEdit 窗口的 100 多个选项设置选项。它还告诉 RichEdit 窗口将 RichEdit 窗口收到的某些消息通知主窗口。 然后它显示窗口并更新它们。您的程序现在作为图形程序运行。 进入一个循环并将收到的所有消息发送到 DispatchMessage,后者将其发送到主窗口过程或 RichEdit 窗口过程。当窗口关闭时,您的循环退出并且程序结束。 窗口程序 这是 Windows 程序的核心。这个程序有两个,主窗口和RichEdit 窗口。 程序员必须编写主窗口过程。虽然只连接默认管道的只是三行代码。 所有窗口都有一个默认的窗口过程。它处理边框、菜单、标题栏、光标、指针等。在 RichEdit 的情况下,窗口过程提供了 MS Word 的大部分功能。 根据消息,从窗口管理器到任一窗口都有一般的窗口消息(如窗口调整 wm_size)。编辑控件通知(RichEdit 也发送与编辑控件相同的通知消息)和 RichEdit 通知由 Richedit 窗口发送到主窗口。 我们只处理我们需要的消息。我们让窗口绘制窗口的边界,然后将消息传递给我们的默认窗口过程。当我们收到 WM_Command 消息时,我们会像选择菜单项一样处理消息。 如果指针位于边框、菜单或标题栏上,窗口管理器会向主窗口发送鼠标消息。如果它在 RichEdit 上,则 RichEdit 窗口将收到这些消息,尽管您可以要求 RichEdit 将它们转发给您,就像该程序对文本已更改和上下文菜单所做的那样。 大多数键转到 RichEdit 控件。它有一个广泛的键盘编辑界面。系统键(如 Alt + F4)和菜单键(Alt + F)被发送到通常不处理它们但将其传递给默认窗口过程的主窗口。主窗口等待默认过程将其作为要执行的命令发送回来(如 WM_Close 退出或 WM_Command 用于选择的菜单项)。 除非我们注册其他键,否则它们将进入 RichEdit 窗口。EG:Ctrl + A 选择所有文本并且是 RichEdit 键盘界面的一部分(然后它向主窗口发送选择更改消息)。但是 Ctrl + S 不是 RichEdit 键盘界面的一部分,RichEdit 会忽略它。所以我们需要注册Ctrl+S,所以主窗口获取它而不是RichEdit,而不是Ctrl+A。 在作为 Select Case 的函数中,主窗口过程检查它是否会处理该消息。如果不是,它将调用默认窗口过程,如果需要,它将处理消息。 然后 要退出程序,您可以通过发送 WM_Close 消息来关闭窗口。这将变成您将收到并调用 PostQuitMessage 的 WM_Destroy 消息。您的窗口程序现在结束了。 主循环接收到 WM_Quit 消息并退出循环。 最后两行破坏了快捷键表和上下文菜单(因为它没有分配给窗口)。分配给窗口的其他菜单会自动销毁。节目结束了。
当按下某个键时,Windows 内核从键盘驱动程序接收消息并将其添加到系统消息队列中。这些消息被发送到机器上所有正在运行的程序,包括处理热键按下的程序。
关于哪些程序处理哪些组合键的文档很少,但可以肯定的是,您可能在任务管理器中看到的 Windows 资源管理器、“Windows 会话管理器”或“Shell 基础结构主机”应用程序负责处理这些组合键。
例如,打开“运行”的Win+组合由 Windows 资源管理器处理。R如果您从任务管理器中关闭 Windows 资源管理器,然后尝试使用该组合,它将不起作用。会话管理器或 shell 基础结构主机可能会处理更多的低级组合,例如Alt+ 。F4
因此,没有一个程序可以处理所有的组合键。它混合了几个预安装的 Windows 应用程序。例如,Windows 资源管理器负责您 PC 上的大部分 GUI,并处理大量这些组合键。
编辑:桌面窗口管理器似乎是处理Alt+等组合键的管理器F4。
请参阅https://docs.microsoft.com/en-us/windows/win32/menurc/wm-syscommand和 wm_command。
这些键在核心 Windows UI dll、user32.dll 中处理。
这是来自编辑器的帮助,解释了特定文本编辑器的编程方式。
Windows 程序的结构
Windows 提供了大量作为窗口实现的控件。该程序使用模仿编辑窗口(记事本使用)的 RichEdit 窗口。这为我们提供了类似 Word 的编辑能力,同时仍将其保留为文本。
子主
程序启动并注册它将使用的窗口 (RegisterWindowsEx)。然后它创建窗口和任何子窗口,包括内置控件 (CreateWindowEx)。
它创建菜单和加速键。
它为主窗口和 RichEdit 窗口的 100 多个选项设置选项。它还告诉 RichEdit 窗口将 RichEdit 窗口收到的某些消息通知主窗口。
然后它显示窗口并更新它们。您的程序现在作为图形程序运行。
进入一个循环并将收到的所有消息发送到 DispatchMessage,后者将其发送到主窗口过程或 RichEdit 窗口过程。当窗口关闭时,您的循环退出并且程序结束。
窗口程序
这是 Windows 程序的核心。这个程序有两个,主窗口和RichEdit 窗口。
程序员必须编写主窗口过程。虽然只连接默认管道的只是三行代码。
所有窗口都有一个默认的窗口过程。它处理边框、菜单、标题栏、光标、指针等。在 RichEdit 的情况下,窗口过程提供了 MS Word 的大部分功能。
根据消息,从窗口管理器到任一窗口都有一般的窗口消息(如窗口调整 wm_size)。编辑控件通知(RichEdit 也发送与编辑控件相同的通知消息)和 RichEdit 通知由 Richedit 窗口发送到主窗口。
我们只处理我们需要的消息。我们让窗口绘制窗口的边界,然后将消息传递给我们的默认窗口过程。当我们收到 WM_Command 消息时,我们会像选择菜单项一样处理消息。
如果指针位于边框、菜单或标题栏上,窗口管理器会向主窗口发送鼠标消息。如果它在 RichEdit 上,则 RichEdit 窗口将收到这些消息,尽管您可以要求 RichEdit 将它们转发给您,就像该程序对文本已更改和上下文菜单所做的那样。
大多数键转到 RichEdit 控件。它有一个广泛的键盘编辑界面。系统键(如 Alt + F4)和菜单键(Alt + F)被发送到通常不处理它们但将其传递给默认窗口过程的主窗口。主窗口等待默认过程将其作为要执行的命令发送回来(如 WM_Close 退出或 WM_Command 用于选择的菜单项)。
除非我们注册其他键,否则它们将进入 RichEdit 窗口。EG:Ctrl + A 选择所有文本并且是 RichEdit 键盘界面的一部分(然后它向主窗口发送选择更改消息)。但是 Ctrl + S 不是 RichEdit 键盘界面的一部分,RichEdit 会忽略它。所以我们需要注册Ctrl+S,所以主窗口获取它而不是RichEdit,而不是Ctrl+A。
在作为 Select Case 的函数中,主窗口过程检查它是否会处理该消息。如果不是,它将调用默认窗口过程,如果需要,它将处理消息。
然后
要退出程序,您可以通过发送 WM_Close 消息来关闭窗口。这将变成您将收到并调用 PostQuitMessage 的 WM_Destroy 消息。您的窗口程序现在结束了。
主循环接收到 WM_Quit 消息并退出循环。
最后两行破坏了快捷键表和上下文菜单(因为它没有分配给窗口)。分配给窗口的其他菜单会自动销毁。节目结束了。