使用键盘挂钩时无法动态退出循环
Can't exit loops dynamically while using keyboard hook
我在使用键盘钩子时遇到一些关于退出 "while" 循环的问题。这是我的代码:
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lParam;
if (wParam == WM_KEYDOWN && nCode == HC_ACTION)
{
}
if (wParam == WM_KEYUP)
{
if (key->vkCode == VK_CAPITAL) {
capslockState = GetKeyState(VK_CAPITAL) & 0x0001;
myLoop(capslockState);
}
}
return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
}
这是我的函数:
int myLoop(int a) {
while (a == 1) {
for (i = 0; i < n; i++) {
// do some stuff
}
if (a == 0) {
break;
return 0;
}
else {
i = 0;
}
}
}
我尝试了更多方法来实现我的目标,但我做不到。我的目标是:我想打开程序,无论 Caps Lock 是开还是关,如果我按下 Caps Lock,它就会开始我的循环,如果我再次按下它,它就会停止。不知何故,我能够使用大量 "while" 循环和线程来完成它,但它几乎用尽了我所有的 CPU 能力。如何在使用键盘输入时创建性能友好的动态循环?
谢谢。
My goal is: I want to open the program, doesn't matter if Caps Lock is
on or off, if I hit Caps Lock, it'll start my loop and if I hit it
again, it'll stop.
您可以检查以下代码,看看它是否有效。
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0) // do not process message
return CallNextHookEx(NULL, nCode,
wParam, lParam);
if (wParam == VK_CAPITAL) {
if(hThread == NULL)
hThread = CreateThread( NULL, 0, myLoop, NULL, 0, NULL);
if (capslockState)
capslockState = 0;
else
capslockState = 1;
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
DWORD WINAPI myLoop(LPVOID lpParam)
{
while (1) {
for (UINT16 i = 0; (i < n && capslockState == 1); i++) {
// do some stuff
}
Sleep(100);
}
return 0;
}
我对您的代码所做的主要编辑:
- 要使主线程能够响应消息并保持您的 for 循环,您需要为 运行 您的 for 循环创建一个新线程(CreateThread)。
- 因为你 "doesn't matter if Caps Lock is on or off" 所以不需要检查大写锁定是否是 on or off state.
- 要检查按下的是哪个键,请使用 wParam to compare with virtual-key code。
- 其他人指出的问题。
更多参考“Using Hooks”
我在使用键盘钩子时遇到一些关于退出 "while" 循环的问题。这是我的代码:
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lParam;
if (wParam == WM_KEYDOWN && nCode == HC_ACTION)
{
}
if (wParam == WM_KEYUP)
{
if (key->vkCode == VK_CAPITAL) {
capslockState = GetKeyState(VK_CAPITAL) & 0x0001;
myLoop(capslockState);
}
}
return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
}
这是我的函数:
int myLoop(int a) {
while (a == 1) {
for (i = 0; i < n; i++) {
// do some stuff
}
if (a == 0) {
break;
return 0;
}
else {
i = 0;
}
}
}
我尝试了更多方法来实现我的目标,但我做不到。我的目标是:我想打开程序,无论 Caps Lock 是开还是关,如果我按下 Caps Lock,它就会开始我的循环,如果我再次按下它,它就会停止。不知何故,我能够使用大量 "while" 循环和线程来完成它,但它几乎用尽了我所有的 CPU 能力。如何在使用键盘输入时创建性能友好的动态循环? 谢谢。
My goal is: I want to open the program, doesn't matter if Caps Lock is on or off, if I hit Caps Lock, it'll start my loop and if I hit it again, it'll stop.
您可以检查以下代码,看看它是否有效。
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0) // do not process message
return CallNextHookEx(NULL, nCode,
wParam, lParam);
if (wParam == VK_CAPITAL) {
if(hThread == NULL)
hThread = CreateThread( NULL, 0, myLoop, NULL, 0, NULL);
if (capslockState)
capslockState = 0;
else
capslockState = 1;
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
DWORD WINAPI myLoop(LPVOID lpParam)
{
while (1) {
for (UINT16 i = 0; (i < n && capslockState == 1); i++) {
// do some stuff
}
Sleep(100);
}
return 0;
}
我对您的代码所做的主要编辑:
- 要使主线程能够响应消息并保持您的 for 循环,您需要为 运行 您的 for 循环创建一个新线程(CreateThread)。
- 因为你 "doesn't matter if Caps Lock is on or off" 所以不需要检查大写锁定是否是 on or off state.
- 要检查按下的是哪个键,请使用 wParam to compare with virtual-key code。
- 其他人指出的问题。
更多参考“Using Hooks”