Комментарии 14
а чем команды плохи? msdn.microsoft.com/en-us/library/ms752308.aspx
+1
Суровато.
Присоединяюсь к вопросу насчёт команд. Там это вроде примерно так (VS под рукой нет) делается:
+ поддержка в разметке, отсутствие завязки на WinAPI.
Ещё не нашел отличий между последним и пред-пред-последним листингом. Наверное там должно быть что-то другое.
Присоединяюсь к вопросу насчёт команд. Там это вроде примерно так (VS под рукой нет) делается:
window.InputBindings.Add(new KeyBinding(YourCommand, Key.G, ModifierKeys.Control | ModifierKeys.Alt));
+ поддержка в разметке, отсутствие завязки на WinAPI.
Ещё не нашел отличий между последним и пред-пред-последним листингом. Наверное там должно быть что-то другое.
0
Честно говоря, как прочитал заголовок, то сразу подумал именно про KeyBinding. Был немного удивлен содержимым. Присоединяюсь к вопросу: Зачем?
0
насчёт комманд ответил выше, по поводу листингов — сейчас поправлю, спасибо
+1
Тут появляется одна небольшая проблема — обработка вызовов WndProc. Дело в том, что в WPF, в отличие от Windows Forms, нельзя просто перегрузить эту функцию в окне приложения.
Сам недавно с этим столкнулся. Можно передавать в RegisterHotkey первым параметром передавать нуль, тогда сообщения будут транслироваться вызвавшему RegisterHotkey потоку.
Сам недавно с этим столкнулся. Можно передавать в RegisterHotkey первым параметром передавать нуль, тогда сообщения будут транслироваться вызвавшему RegisterHotkey потоку.
+1
Эх… На пару деньков раньше бы…
0
При использовании RegisterHotKey и GlobalAddAtom начинаются проблемы как только приложение начинает жить только в виде маленькой иконки глубоко в трее. В таком случае спасают только хуки.
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
// запуск отлова
private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (var curProcess = Process.GetCurrentProcess())
{
using (var curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
}
}
}
// отлов и, при необходимости, обработка хоткея
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
var vkCode = (Keys)Marshal.ReadInt32(lParam);
switch (vkCode)
{
case Keys.MediaNextTrack:
{
break;
}
}
}
return CallNextHookEx(hookId, nCode, wParam, lParam);
}
+3
Никогда не вызывается WndProc.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Регистрация глобальных «хоткеев» при использовании WPF