Я провел много поисков без реального решения (моей собственной проблемы), поэтому я решил спросить здесь.
Я разрабатываю киоск-подобную программу, которая не позволяет пользователю использовать клавиши задач (alt + tab, alt + esc, ctrl + esc и т. Д.) Во время работы программы. Обратите внимание, что я начинающий программист, поэтому я хотел бы избежать отдельной обработки DLL, если смогу. В частности, я пошел на этот сайт http://support.microsoft.com/kb/226359/en-us для кода. Упрощенная часть моего кода выглядит следующим образом:
HHOOK mule;
HHOOK g_hKeyboardHook;
BOOL g_bFullscreen;
LRESULT CALLBACK LowLevelKeyboardProc (INT nCode, WPARAM wParam, LPARAM lParam)
{
// By returning a non-zero value from the hook procedure, the
// message does not get passed to the target window
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
BOOL bControlKeyDown = 0;
switch (nCode)
{
case HC_ACTION:
{
// Check to see if the CTRL key is pressed
bControlKeyDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1);
// Disable CTRL+ESC
if (pkbhs->vkCode == VK_ESCAPE && bControlKeyDown)
return 1;
// Disable ALT+TAB
if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN)
return 1;
// Disable ALT+ESC
if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags & LLKHF_ALTDOWN)
return 1;
break;
}
default:
break;
}
return CallNextHookEx (mule, nCode, wParam, lParam);
}
Мой главный
int main(int argc, char **argv)
{
_getch();
g_hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), 0 );
cout << "Testing task keys disabling (alt tab, ctrl esc, alt esc) and taskbar..." << endl;
_getch();
UnhookWindowsHookEx( g_hKeyboardHook );
cout << "Re enabled" << endl;
_getch();
return 0;
}
Я понимаю, что этот код предназначен для действительно старых ОС Windows, но я посмотрел вокруг, и другие решения напоминают этот код, поэтому я подумал, что он должен работать.
Но по некоторым причинам это, кажется, не работает. Всякий раз, когда моя программа попадает в эту строку кода, она останавливается примерно на 5 секунд и продолжает работать, но клавиши задач все еще работают.
Я слышал, что я должен реализовывать эту функцию как dll вместо того, чтобы помещать все в один файл, но я не уверен, что они абсолютно правы (также я ничего не знаю о dll)
Кроме того, я также попробовал код (чтобы отключить ключ Windows) здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ee416808(v=vs.85).aspx и он делает то же самое, что и моя собственная программа (останавливается и ничего не делает)
Может кто-нибудь определить, где я сделал что-то не так? Я использую VC ++ 2010 на Windows 7 64bit.
Задача ещё не решена.