GetOpenFileName() 和 GetSaveFileName() 使 GetAsyncKeyState() 停止工作
GetOpenFileName() and GetSaveFileName() make GetAsyncKeyState() stop working
GetOpenFileName()
和 GetSaveFileName()
使 GetAsyncKeyState()
停止工作。
(注意:我也在某些地方使用 <conio.h>
中的 getch()
,如果有的话)
一个小例子(未测试):
#include <commdlg.h>
#include <windows.h>
#include <iostream>
using std::cout;
#define keyPressed(x) GetAsyncKeyState(x) & 0x8000
int main () {
while (true) {
if (keyPressed('w')) {
cout << "W pressed\n";
break;
}
}
OPENFILENAME ofn = {0};
char Buffer[300];
std::fill(Buffer, Buffer + 300, '[=10=]');
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = GetForegroundWindow();
ofn.lpstrFile = Buffer;
ofn.nMaxFile = 300;
ofn.Flags = OFN_EXPLORER;
ofn.lpstrFilter = NULL;
ofn.lpstrCustomFilter = NULL;
ofn.nFilterIndex = 0;
ofn.lpstrFileTitle = NULL;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
if (!GetOpenFileName(&ofn)) {
cout << "Error\n";
}
while (true) {
if (keyPressed('w')) {
cout << "W pressed\n";
break;
}
}
}
我该如何解决这个问题?
我确定 GetAsyncKeyState
正常工作,但在 open/save 对话框打开时您实际上并没有调用它,因为这些模态对话框 运行 它们自己的消息循环和在您关闭对话框之前,函数不会 return 返回您的代码。
您可以 运行 另一个线程中的 GetAsyncKeyState
循环然后它会起作用,但您不应该这样做,因为在循环中轮询是不好的。使用 RegisterHotKey
或 low-level keyboard hook.
最后,GetAsyncKeyState
检查虚拟键码,而不是任意 ASCII 字符。
好的,感谢@Anders,将 ofn.hwndOwner 设置为 NULL 有效。谢谢!
我不需要在另一个线程中进行投票或使用虚拟键码,但感谢您的帮助!
GetOpenFileName()
和 GetSaveFileName()
使 GetAsyncKeyState()
停止工作。
(注意:我也在某些地方使用 <conio.h>
中的 getch()
,如果有的话)
一个小例子(未测试):
#include <commdlg.h>
#include <windows.h>
#include <iostream>
using std::cout;
#define keyPressed(x) GetAsyncKeyState(x) & 0x8000
int main () {
while (true) {
if (keyPressed('w')) {
cout << "W pressed\n";
break;
}
}
OPENFILENAME ofn = {0};
char Buffer[300];
std::fill(Buffer, Buffer + 300, '[=10=]');
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = GetForegroundWindow();
ofn.lpstrFile = Buffer;
ofn.nMaxFile = 300;
ofn.Flags = OFN_EXPLORER;
ofn.lpstrFilter = NULL;
ofn.lpstrCustomFilter = NULL;
ofn.nFilterIndex = 0;
ofn.lpstrFileTitle = NULL;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
if (!GetOpenFileName(&ofn)) {
cout << "Error\n";
}
while (true) {
if (keyPressed('w')) {
cout << "W pressed\n";
break;
}
}
}
我该如何解决这个问题?
我确定 GetAsyncKeyState
正常工作,但在 open/save 对话框打开时您实际上并没有调用它,因为这些模态对话框 运行 它们自己的消息循环和在您关闭对话框之前,函数不会 return 返回您的代码。
您可以 运行 另一个线程中的 GetAsyncKeyState
循环然后它会起作用,但您不应该这样做,因为在循环中轮询是不好的。使用 RegisterHotKey
或 low-level keyboard hook.
最后,GetAsyncKeyState
检查虚拟键码,而不是任意 ASCII 字符。
好的,感谢@Anders,将 ofn.hwndOwner 设置为 NULL 有效。谢谢!
我不需要在另一个线程中进行投票或使用虚拟键码,但感谢您的帮助!