- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个简单的程序来监听大写锁定键,并显示一个消息框,说明当前大写锁定是打开还是关闭。
所以:用户按下大写锁定,程序确定大写锁定现在处于什么状态(打开或关闭)并显示一个消息框。
实际发生的是,当大写锁定被转动时 在 ,程序显示消息框说它是 关闭 反之亦然。
我已经阅读了函数的文档,但仍然不理解这种不需要的(相反的)行为,并想知道如何(以及是否)可以解决这个问题。
这是我的代码:
#include <Windows.h>
// Research/credits/references
// https://www.unknowncheats.me/forum/c-and-c-/83707-setwindowshookex-example.html
// http://www.rohitab.com/discuss/topic/38617-get-the-state-of-capslock/
HHOOK _hook;
// This struct contains the data received by the hook callback. As you see in the callback function
// it contains the thing you will need: vkCode = virtual key code.
KBDLLHOOKSTRUCT kbdStruct;
// This is the callback function. Consider it the event that is raised when, in this case,
// a key is pressed.
LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
// the action is valid: HC_ACTION.
if (wParam == WM_KEYDOWN)
{
// lParam is the pointer to the struct containing the data needed, so cast and assign it to kdbStruct.
kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
// a key (non-system) is pressed.
if (kbdStruct.vkCode == VK_CAPITAL)
{
if ((GetKeyState(VK_CAPITAL) & 0x0001) != 0)
MessageBox(NULL, "Caps Lock ON!", "Caps Lock", MB_ICONINFORMATION);
else
MessageBox(NULL, "Caps Lock OFF!", "Caps Lock", MB_ICONINFORMATION);
}
}
}
// call the next hook in the hook chain. This is nessecary or your hook chain will break and the hook stops
return CallNextHookEx(_hook, nCode, wParam, lParam);
}
void SetHook()
{
// Set the hook and set it to use the callback function above
// WH_KEYBOARD_LL means it will set a low level keyboard hook. More information about it at MSDN.
// The last 2 parameters are NULL, 0 because the callback function is in the same thread and window as the
// function that sets and releases the hook. If you create a hack you will not need the callback function
// in another place than your own code file anyway. Read more about it at MSDN.
if (!(_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)))
{
MessageBox(NULL, "Failed to install hook!", "Error", MB_ICONERROR);
}
}
void ReleaseHook()
{
UnhookWindowsHookEx(_hook);
}
int main()
{
// Set the hook
SetHook();
// Don't mind this, it is a meaningless loop to keep a console application running.
// I used this to test the keyboard hook functionality.
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
}
return 0;
}
最佳答案
GetKeyState
返回处理当前按键和更新键盘状态之前的状态。例如,如果 CAPS LOCK 为 OFF 并且您按下 CAPS LOCK 键,钩子(Hook)被调用和 GetKeyState
报告当前状态为 OFF,然后按键被处理并打开 CAPS LOCK。
这是在 LowLevelKeyboardProc callback function 中间接暗示的:
Note: When this callback function is called in response to a change in the state of a key, the callback function is called before the asynchronous state of the key is updated. Consequently, the asynchronous state of the key cannot be determined by calling GetAsyncKeyState from within the callback function.
GetKeyState
反射(reflect)
GetAsyncKeyState
报告的物理状态之前的线程状态,间接暗示对
GetKeyState
的调用将返回之前的状态。
关于c++ - Windows C++ GetKeyState 大写锁定检测器相反,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66510965/
我希望在按下某个键时切换 bool 事件。具体来说,'s' 键。我已被指向函数 GetKeyState(),它应该在 Win32 API 下工作。我知道字母's'的ASCII码是115,所以我的代码如
我需要为我的小应用程序监听键盘按键状态。 #include #include #include using namespace std; int main() { while(1)
在VCL(Delphi 2010)中我使用这个函数来检查控制键是否被按下: function IsControlKeyPressed: Boolean; begin Result := GetKe
使用 GetKeyState,我可以在按下某个键时执行一些任务。但是,如果我有 if (GetKeyState(VK_UP) & 0x80),它会在整个按住键的过程中返回 true。 如果我只想在按下
大家好,我正在使用 C 中的代码块。我阅读了 https://msdn.microsoft.com/en-us/library/windows/desktop/ms646301(v=vs.85).as
当我使用 GetKeyState 或 GetAsyncKeyState 按下某些键时,我遇到了问题,两者都记录了按下键的历史记录。所以当我有一个 cin>> 这是我按下的键。 if(GetKeySta
我编写了一个简单的程序来监听大写锁定键,并显示一个消息框,说明当前大写锁定是打开还是关闭。 所以:用户按下大写锁定,程序确定大写锁定现在处于什么状态(打开或关闭)并显示一个消息框。 实际发生的是,当大
有时我会收到客户的错误报告,但我无法解释。在 Delphi 中的 Application.Run() 之后,我收到以下错误: EOSError: System error: Code:_5 Acce
Keyboard.GetKeyStates 似乎有一种方法可以返回错误按下的键,例如 Keyboard.GetKeyStates(Key.NumPad2) 可以返回 向下,切换,即使没有按下也是如此。
从MSDN ,我了解到GetKeyState 与当前线程的消息队列相关联。 然后我创建了两个示例应用程序:KeyPresser 和 BackChecker。 我在 KeyPresser 中按下一个键,
我正在使用 C# 开发一个简单的通用 Windows 应用程序。我有一个 RichEditBox,并且在使用 Control+I 组合键时发现了奇怪的行为,由于某种原因,它会插入一个 Tab(这是预期
我正在使用 C# 开发一个简单的通用 Windows 应用程序。我有一个 RichEditBox,并且在使用 Control+I 组合键时发现了奇怪的行为,由于某种原因,它会插入一个 Tab(这是预期
在下面的代码中:- BYTE ks[256]; auto keyboard_layout = GetKeyboardLayout(0); GetKeyboardState(ks); auto w =
与获得按键有什么区别: GetKeyState() GetAsyncKeyState() getch()? 我应该什么时候使用一个而不是另一个? 最佳答案 GetKeyState() 和 GetAsy
#include int main() { if ( !GetKeyState(VK_CAPITAL) & 1 ) { printf("caps off"); } else printf("caps
基本上, 它的灵感来自 Vim 我想使用一个键(例如 Alt、F1)组合(+I J K L)来映射到箭头键 Autohotkey 中已经完成的工作 Ralt & j::send{Left} Ralt
我是一名优秀的程序员,十分优秀!