当我的程序不是活动程序时,如何停止使用 GetKeyState 获取值?

Posted

技术标签:

【中文标题】当我的程序不是活动程序时,如何停止使用 GetKeyState 获取值?【英文标题】:How do I stop getting values with GetKeyState when my program isnt the active program? 【发布时间】:2017-11-04 12:16:30 【问题描述】:

我正在制作一个程序,它使用GetKeyState() 函数来检查是否按下了某个键。但是,当程序未处于活动状态时(它只是在后台运行),我仍然会获得按下按键时的值。我怎样才能克服这个问题,以便仅在我的程序处于活动状态时才获得值?

对于我的其中一个键,代码如下:

if (GetKeyState('A') < 0)

    canvas [1] = colour;

【问题讨论】:

检查焦点。 如果您只需要活动时的值,您应该使用窗口消息。这就是他们的目的。 @Mgetz 你能举个例子吗?我只听说过这些 if(::GetForegroundWindow() == my_window_handle) @SamFielding 处理窗口消息你必须有一个窗口There is a tutorial on MSDN 【参考方案1】:

GetKeyState 只能用于检查 CtrlShift 等以响应另一个输入消息:

应用程序调用 GetKeyState 以响应键盘输入消息

窗口/控件的大部分键盘输入应该来自keyboard messages,主要是WM_KEYDOWNWM_CHARWM_KEYUP。这些消息被发送到具有键盘焦点的窗口。一些常用控件还允许父窗口处理一些输入消息。

【讨论】:

【参考方案2】:

所以我不能使用任何其他方法,因为我根本不知道如何,以下是我为其他想知道的人解决的方法:

我创建了一个常量变量,它等于打开时的活动窗口(我的程序很小,所以打开速度非常快)

const HWND window2 = GetForegroundWindow();

然后我测试一下当前活动窗口是否和这个一样:

    HWND Window = GetForegroundWindow();
if (window2 == Window)  `**Put original code here**` 

这绝对是一种粗略的做法,当然它可能不适用于大型程序,但如果它有效,它就有效:)。

【讨论】:

以上是关于当我的程序不是活动程序时,如何停止使用 GetKeyState 获取值?的主要内容,如果未能解决你的问题,请参考以下文章

让我的 GPS 传感器停止时遇到一些问题

当我的应用程序在 iOS 应用程序的前台时,是不是有停止屏幕锁定?

如何在其他应用程序上显示对话框而不是停止其他活动

在相机活动期间按返回按钮停止应用程序

当我回去时,我的应用已停止[重复]

在Android中,当我播放音频并转到其他活动时,音频回来后不会停止