Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GetAsyncKeyState()-外部程序会干扰它_C++_C_Windows_Winapi_Mfc - Fatal编程技术网

C++ GetAsyncKeyState()-外部程序会干扰它

C++ GetAsyncKeyState()-外部程序会干扰它,c++,c,windows,winapi,mfc,C++,C,Windows,Winapi,Mfc,我编写了一个使用GetAsyncKeyState()的小程序,它本身就可以正常工作 问题是,当我运行某个外部应用程序(不是我的)时,我的GetAsyncKeyState()完全停止接收输入。我希望能够运行这两个应用程序 我能做些什么来强迫我的程序再次接收键盘输入吗?是什么导致了这个问题 谢谢 **更多详细信息** 我正在使用MFC并处理WM_定时器消息,从而捕获键盘输入。我将输入设置为可配置,然后调用 if(GetAsyncKeyState(chVirtualKey) < 0) { //s

我编写了一个使用GetAsyncKeyState()的小程序,它本身就可以正常工作

问题是,当我运行某个外部应用程序(不是我的)时,我的GetAsyncKeyState()完全停止接收输入。我希望能够运行这两个应用程序

我能做些什么来强迫我的程序再次接收键盘输入吗?是什么导致了这个问题

谢谢

**更多详细信息**

我正在使用MFC并处理WM_定时器消息,从而捕获键盘输入。我将输入设置为可配置,然后调用

if(GetAsyncKeyState(chVirtualKey) < 0) { //stuff happens }
然后处理它:

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam;

        if (p->vkCode == VK_SPACE) // spacebar key
        {
             SetCursorPos(400, 400); //just to test
        }
     }
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

这个钩子工作,但只有当其他应用程序没有运行,所以我仍然被卡住

与其他应用程序的支持人员交谈后,我的问题得到了解决。 我所要做的就是让我的应用程序在管理模式下运行


谢谢大家的帮助!我确实用钩子学了一些新把戏

它停止接收输入是什么意思
GetAsyncKeyState
本身不“接收输入”。你什么时候叫它?你在投票吗?打电话回应一条信息?显示一些源代码…
Get(Async)KeyState()
依赖于本地缓存在调用线程中的键盘数据。外部进程可以干预的唯一方法是,它正在使用或正在使用钩子在键盘消息到达线程的消息队列之前拦截和丢弃/修改键盘消息。我可以建议一个实验:创建一个简单的基于对话框的应用程序,它使用
GetAsyncKeyState
处理
WM_定时器
,并查看在另一个应用程序运行时该定时器是否也“损坏”。这将告诉您这完全是另一个应用程序的错误,还是您的应用程序也在某种程度上起了作用。除了自己挂接键盘(查看
SetWindowsHookEx()
registerarWinputDevices()
)或提示用户不要运行另一个应用程序之外,您可能没有其他办法。可能与另一个应用程序的所有者联系并抱怨它干扰了你的应用程序。@索兰:只有两个键盘挂钩可用
SetWindowsHookEx()
-
WH\u-keyboard
WH\u-keyboard\u-LL
。两个都试试。但原始输入会更好,因为数据直接来自键盘,而不是一组系统队列。不过,我不知道它是否受到
BlockInput()
的影响。
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam;

        if (p->vkCode == VK_SPACE) // spacebar key
        {
             SetCursorPos(400, 400); //just to test
        }
     }
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}