Я испытываю странное поведение при использовании GetKeyState (или GetAsyncKeyState, если уж на то пошло) в консольном приложении. Одним из аспектов приложения является запрос у пользователя файла для открытия с помощью GetFileOpen. В конце программы GetKeyState отслеживает состояние пробела. Функция GetKeyState (или GetAsyncKeyState) никогда не устанавливает старший бит всякий раз, когда нажимается пробел. Если я не вызываю GetOpenFile, а затем не отслеживаю GetKeyState, все работает как положено.
Вот два основных сценария.
Сценарий 1:
#include <windows.h>
int main(int argc, char *argv[])
{
char filename[ 512 ] = {0};
OPENFILENAME ofn = {0};
int filenameSize = 512;
char title[1000] = {0};
strcpy(title, "Open File");
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = null;
ofn.lpstrFile = filename;
ofn.nMaxFile = filenameSize;
ofn.lpstrFilter = "All files (*.*)\0*.*\0\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpfnHook = NULL;
ofn.lpstrTitle = title;
ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
GetOpenFileName(&ofn); // filename obtained
WaitForSpaceBar(); // return value's upper bit is never set for
// GetKeyState(VK_SPACE);
return 0;
}
Сценарий 2:
int main(int argc, char *argv[])
{
WaitForSpaceBar(); // returns immediately after spacebar is pressed
return 0;
}
Код WaitForSpaceBar
void WaitForSpaceBar()
{
#define KEY_PRESSED_FLAG 1
SHORT spacePressed = GetKeyState(VK_SPACE);
printf("\nPress spacebar to continue...\n");
while (!(spacePressed & KEY_PRESSED_FLAG))
{
Sleep(1);
spacePressed = GetKeyState(VK_SPACE);
// for debugging purposes only
printf("spacePressed = 0x%04x\n", spacePressed);
}
}
Первый сценарий выводит «spacePressed = 0x0000» бесконечно, независимо от того, сколько раз я нажимаю пробел.
Второй сценарий выводит «spacePressed = 0x0000» до тех пор, пока пробел не будет фактически нажат. После нажатия выводится «spacePressed = 0xffffff81», и программа завершается.
Любые идеи относительно того, что происходит?
GetKeyState
требует, чтобы приложение считывало ключевые сообщения из своей очереди сообщений. Очередь сообщений — это концепция приложения с графическим интерфейсом. - person IInspectable   schedule 11.12.2013GetAsyncKeyState
.GetKeyState
возвращает состояние, которое было при обработке последнего сообщения, а не состояние, которое есть сейчас. - person Jonathan Potter   schedule 11.12.2013