C # p / вызов для регистрации хоткей для комбинации клавиш ALT TAB не работает (возвращает 0)

#c# #pinvoke #wndproc #registerhotkey

#c# #pinvoke #wndproc #registerhotkey

Вопрос:

Я использую следующий код для перехвата последовательности клавиш ALT TAB в моем приложении на c #.

Некоторые соответствующие фрагменты:

 [DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
  

и

 bool ret = RegisterHotKey(this.Handle, 0, MOD_ALT, 0x09);
Console.WriteLine("return value:"   ret);
Console.WriteLine("lasterror="   Marshal.GetLastWin32Error());
  

и

     protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_HOTKEY)
        {
            MessageBox.Show("Generic hotkey interception");
            if (m.WParam.ToInt32() == 0)
            {
                MessageBox.Show("ALT TAB intercepted");
            }
        }
        base.WndProc(ref m);
    }
  

В значительной степени во втором фрагменте ret равно false , но когда я заменяю MOD_ALT (который равен 0x01) на MOD_SHIFT (0x04), ret становится true, и перехват горячих клавиш работает.

Мне было интересно, почему это так, потому что многие примеры, которые я видел в Интернете, утверждают, что они работают.

Комментарии:

1. AFAIK комбинация, которую вы хотите перехватить, — это общесистемная горячая клавиша — я бы ожидал, что это не сработает в текущих версиях Windows, поскольку это создало бы огромную проблему безопасности, если бы это произошло…

2. Это важный ярлык Windows, похожий на Ctrl Esc. Процесс не может быть таким разрушительным.

3. @Hans Я думаю, вы ошибаетесь. MSDN: «До Windows XP попытка зарегистрировать AltTab в качестве горячей клавиши завершалась неудачей. Начиная с Windows XP, вы не только можете успешно зарегистрировать AltTab в качестве горячей клавиши, Windows XP также позволит вам обрабатывать это событие самостоятельно, а не запускать собственный встроенный обработчик горячих клавиш AltTab. »

4. Мой опыт показывает, что вы можете зарегистрировать Alt Tab в качестве горячей клавиши в Windows XP, но не в Windows 7. Очень неприятно, что они больше не разрешают это, поскольку это значительно усложняет написание пользовательского переключателя Alt Tab.

Ответ №1:

Возможно, вы не можете передать 0 параметр Id? Смотрите ссылку ниже, в которой указаны IDH_ALTTAB, IDH_NEXT или IDH_PREV. Чему это соответствует… Я не знаю.

http://msdn.microsoft.com/en-us/library/ms997649.aspx#xpvisualstyles_topic3

Комментарии:

1. Я думаю, что эти константы (например, IDH_ALTTAB) являются заполнителями для определяемых пользователем констант, которые не показаны в примере. Однако вполне возможно, что 0 не является допустимым идентификатором.

Ответ №2:

Запуск от имени администратора исправил это.