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 有效。谢谢!

我不需要在另一个线程中进行投票或使用虚拟键码,但感谢您的帮助!