GetOpenFileName()并GetSaveFileName()停止GetAsyncKeyState()作業。
(注意:我也在某些地方使用getch()from <conio.h>,如果有的話)
一個小例子(未經測驗):
#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, '\0');
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;
}
}
}
我怎樣才能解決這個問題?
uj5u.com熱心網友回復:
我確定GetAsyncKeyState作業正常,但您實際上并沒有在打開/保存對話框打開時呼叫它,因為這些模式對話框運行它們自己的訊息回圈,并且該函式在您關閉對話框之前不會回傳到您的代碼。
您可以GetAsyncKeyState在另一個執行緒中運行回圈,然后它會作業,但您不應該這樣做,因為在回圈中輪詢是不好的。使用RegisterHotKey或低級鍵盤掛鉤。
最后,GetAsyncKeyState檢查虛擬鍵碼,而不是任意 ASCII 字符。
uj5u.com熱心網友回復:
好的,感謝@Anders,將 ofn.hwndOwner 設定為 NULL 有效。謝謝!
我不需要在另一個執行緒中投票或使用虛擬鍵碼,但感謝您嘗試幫助我!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/422668.html
標籤:
