Перехват клавиатуры alt-tab вызывает странное поведение? - PullRequest
0 голосов
/ 29 февраля 2012

Я хочу запретить пользователю моего приложения использовать alt-tab.Я пытаюсь решить эту проблему с помощью низкоуровневой клавиатуры.

Настройка работает отлично, процедура обратного вызова запускается, когда я нажимаю комбинацию клавиш и т. Д. Странная вещь, которая происходит, - это то, что я могу-tab вне приложения, но затем alt-tabbing полностью отключается.Я переключаю приложения с помощью мыши и пробую alt-tabbing, но ничего не происходит.Я снова переключаюсь на свое приложение и снова нажимаю alt-tab, и оно переключает приложение, но только на один шаг.Когда из моего приложения alt-tab больше не работает.

Я пробовал разные сценарии, сначала я подумал, что это как-то связано с отладчиком в VS2010, но нет, запустив его без отладчика.дает те же результаты.

Полностью ли я неправильно понял эту процедуру перехвата, она предназначена только для перехвата вещей, происходящих, когда приложение не в фокусе?

osman.hpp:

static HHOOK m_hhook;

static LRESULT CALLBACK lowLevelKeyboardProc( int key, WPARAM wParam, LPARAM lParam );

osman.cpp:

HHOOK OSMan::m_hhook;

/*
* pseudo init code
*/
void OSMan::init()
{
     m_hHook = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC)lowLevelKeyboardProc, 0, 0 );
}

LRESULT CALLBACK OSMan::lowLevelKeyboardProc( int key, WPARAM wParam, LPARAM lParam )
{
    KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;

    switch (key)
    {
    case HC_ACTION:
        {
           if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN)
                 return 1;

        }

    default:
         break;
    }
   return CallNextHookEx( m_hHook, key, wParam, lParam);
}

изменить:

  • добавлен код.

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Вы устанавливаете системный хук, поэтому вы отключили использование Alt-TAB во всей системе.

Вы не можете использовать WH_KEYBOARD_LL , вы должны использовать WH_KEYBOARD ловушку и сделать ее специфичной для процесса.

Параметры SetWindowsHookEx изменятся, если вы сделаете свой процесс ловушки конкретным.

Вот обзор параметров:

dwThreadId [in] Тип: DWORD

Идентификатор потока, с которым должна быть связана процедура подключения.

Если этот параметрноль, процедура подключения связана со всеми существующими потоками, работающими на том же рабочем столе, что и вызывающий поток.

PS: в ответ на комментарий:

перехват устанавливается только послеПроцесс получил одно подходящее событие.При подключении к сообщениям клавиатуры, вам нужно будет отправить хотя бы одно сообщение клавиатуры, прежде чем будет установлен хук.

Работа вокруг

Может быть, вы хотите обойти эту проблему с помощью функции ShowWindow ?Вот документация: http://www.pinvoke.net/default.aspx/user32.showwindow

ср: http://www.codeproject.com/Articles/4610/Three-Ways-to-Inject-Your-Code-into-Another-Proces

ср http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx и http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspx#wh_keyboardhook

0 голосов
/ 29 февраля 2012

Если вы хотите отключить alt + tab правильно, вам нужно просто зарегистрировать горячую клавишу с помощью RegisterHotKey(0,0,MOD_ALT,VK_TAB); и затем обработать (ну, лучше игнорировать) сообщение, которое это генерирует,это позволяет сделать приложение локальным, не беспокоясь о цепочках хуков Windows, и позволяет легко включить или отключить его на лету.

Хотя для игры код обработки ввода idTech 4 имеет огромное количество входных камней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...