мне нужно обнаружить, если различные комбинации сдвига, управления, & Alt нажатия клавиш во время запуска программы. Это должно произойти до того, как откроется любое окно.Альтернативе GetAsyncKeyState
Я знаю все о GetAsyncKeyState, но эта функция не работает, если ваша программа не является приоритетной задачей в Windows, и когда программа запускается первый раз, то на первый план задачу не до тех пор пока окно не открывается.
Программа WIN32/C++/MFC/32-bit. Есть идеи?
Дополнительная информация Добавлено: Это работает на 64-битной Win8. Кроме того, в то время как я только упомянул GetAsyncKeyState, я также пытался GetKeyState, но результаты не очень отражают состояние ТОК и никогда не работал для Alt вообще.
Вот пример кода, взятый из моего класса приложения Метод InitInstance (это основной() для приложения MFC) перед тем, как откроется главное окно.
#define USE_GETASYNCKEYSTATE (1)
// Following two lines are added for testing so there's a
// specific time to make sure keys are pressed
AfxMessageBox("Press keys after dismissing this message");
Sleep(2000);
#if USE_GETASYNCKEYSTATE
short altKeyStatus = GetAsyncKeyState(VK_MENU) & 0x8000;
short shiftKeyStatus = GetAsyncKeyState(VK_SHIFT) & 0x8000;
short controlKeyStatus = (short)GetAsyncKeyState(VK_CONTROL) & 0x8000;
#else
char kbBuf[256];
GetKeyboardState((PBYTE)kbBuf);
short altKeyStatus = (short)kbBuf[VK_MENU];
short shiftKeyStatus = (short)kbBuf[VK_SHIFT];
short controlKeyStatus = (short)kbBuf[VK_CONTROL];
#endif
CString msg;
msg.Format("ALT: %d, SHIFT: %d, CTRL: %d",
altKeyStatus, shiftKeyStatus, controlKeyStatus);
AfxMessageBox(msg);
Когда он работает с использованием GetAsyncKeyState, все три переменные возвращаются ZERO во все времена.
Когда я бег блока GetKeyboardState, иногда я получаю результаты о том, что сдвиг и/или управления были нажаты. То есть, нажато некоторое время в последнее время, но не обязательно соответствует текущему состоянию, и он никогда не возвращает ничего, кроме нуля, для Alt.
Обратите внимание, что первые две строки с Sleep могут быть удалены без изменения результатов. Я добавил их, чтобы быть уверенным, что нажатие клавиши произошло во время работы программы.
Ссылка на запись MSDN для GetAsyncKeyState: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646293(v=vs.85).aspx –
Возвращаемое значение равно нулю для следующих случаев : «Тема переднего плана принадлежит другому процессу, и рабочий стол не разрешает захват или запись журнала». Это должно быть вашей проблемой. Для записи я использовал «GetAsyncKeyState» успешно в прошлом. – rodrigo
Родриго, мне это хорошо известно. Это часть моего первоначального вопроса. Почему это не работает, это не тайна ... Мне просто нужна альтернатива. –