2013-04-21 2 views
0

мне нужно обнаружить, если различные комбинации сдвига, управления, & 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 могут быть удалены без изменения результатов. Я добавил их, чтобы быть уверенным, что нажатие клавиши произошло во время работы программы.

ответ

2

Нет, вы получили это назад. Это GetKeyState(), что не сработает, GetAsyncKeyState() в порядке. Обычно вы должны использовать GetKeyState(), так как он возвращает буферное состояние клавиатуры. Важно, потому что сообщения клавиатуры буферизуются в очереди сообщений. Но это не может работать, когда ваша программа не имеет фокуса или еще не создала очередь сообщений. Последнее ваше дело.

Правильно выбирайте магические ключи, они имеют тенденцию мешать щелчку на ярлыке на рабочем столе. Я нашел ключ Scroll Lock полезным в этом случае. Не используется для большей части всего, у него обычно есть свет, и он защелкивается, поэтому его можно включить, не паникуя клавиатурой.

+0

Ссылка на запись MSDN для GetAsyncKeyState: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646293(v=vs.85).aspx –

+0

Возвращаемое значение равно нулю для следующих случаев : «Тема переднего плана принадлежит другому процессу, и рабочий стол не разрешает захват или запись журнала». Это должно быть вашей проблемой. Для записи я использовал «GetAsyncKeyState» успешно в прошлом. – rodrigo

+0

Родриго, мне это хорошо известно. Это часть моего первоначального вопроса. Почему это не работает, это не тайна ... Мне просто нужна альтернатива. –

0

Я не уверен, что ваш импорт этой функции верен, потому что вы делаете результат от short, который должен быть уже short.У меня была также проблема с GetAsyncKeyState, и я решил ее путем коррекции импорта:

// C# 
[DllImport("user32.dll", SetLastError = true)] 
static extern short GetAsyncKeyState(int virtualKey); 

По непонятной причине он работал только иногда, когда я был int как результат.

+0

Привет, я ценю ваш ответ, но это код на C++, а не C#, поэтому нет такого объявления импорта. Прототип функции включен в один из основных файлов заголовков Windows. И бросок на короткий - это какой-то старый гранж, но он оптимизирован в небытие ... вообще не имеет никакого отношения к результирующему коду. –

+0

Как объяснил, у меня возникла проблема с GetAsyncKeyState и она была решена. Если у вас все еще есть проблемы с этим, вы можете попробовать другой подход, импортировав функцию самостоятельно или что угодно. – Bitterblue

Смежные вопросы