#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:
Запуск от имени администратора исправил это.