| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Использование горячих клавиш |
| Автор: Sergio 8.7.2008, 00:40 |
| Здравствуйте. Моя программа находится в трее. Как мне крмбинацией двох клавиш "поднять" её? Есть ли быстрый вариант? Или нужно использовать хуки(которые для меня проблематично реализовать Заранее спасибо. |
| Автор: loma 8.7.2008, 01:20 |
| Хуки на C# using System; using System.Diagnostics; using System.Windows.Forms; using System.Runtime.InteropServices; class TEST { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private static LowLevelKeyboardProc _proc = HookCallback; private static IntPtr _hookID = IntPtr.Zero; public static void Main() { _hookID = SetHook(_proc); Application.Run(); UnhookWindowsHookEx(_hookID); } private static IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if ( (nCode >= 0) && (wParam == (IntPtr)WM_KEYDOWN) ) { int vkCode = Marshal.ReadInt32(lParam); if( ((Keys)vkCode == Keys.LWin)||((Keys)vkCode == Keys.RWin) ) { Console.WriteLine("{0} blocked!", (Keys)vkCode); return (IntPtr)1; } } return CallNextHookEx(_hookID, nCode, wParam, lParam); } [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); } |
| Автор: Sergio 9.7.2008, 00:35 | ||
| loma, спасибо за помощь. Один только вопрос как использовать комбинации клавиш? Например (Shift + d) Как поменять теперь код?
|
| Автор: loma 9.7.2008, 03:28 |
| using System; using System.Diagnostics; using System.Windows.Forms; using System.Runtime.InteropServices; class TEST { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private static LowLevelKeyboardProc _proc = HookCallback; private static IntPtr _hookID = IntPtr.Zero; public static void Main() { _hookID = SetHook(_proc); Application.Run(); UnhookWindowsHookEx(_hookID); } private static IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if ((nCode >= 0) && (wParam == (IntPtr)WM_KEYDOWN)) { int vkCode = Marshal.ReadInt16(lParam); if (((Keys)vkCode == Keys.D)&& ((GetKeyState((int)Keys.RShiftKey)<0) || (GetKeyState((int)Keys.LShiftKey)<0))) { Console.WriteLine("{0} blocked!", (Keys)vkCode ); return (IntPtr)1; } } return CallNextHookEx(_hookID, nCode, wParam, lParam); } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern Int16 GetKeyState(int nVirtKey); [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); } |
| Автор: nikitao 9.7.2008, 03:38 | ||
loma, на форуме есть BB код
Пожалуйста используйте его |
| Автор: Sergio 9.7.2008, 17:11 |
| loma, спасибо. +1 |
| Автор: CasperSC 8.4.2010, 13:27 | ||
GetKeyState как это использовать? У меня показывает, что не доступно в текущем контексте. System.Window.Input не помогает. |