Использование некоторых онлайн-руководства и пример кода. Я реализовал перехват клавиатуры. Чтобы моя программа работала, мне нужно сидеть в фоновом режиме и ждать нажатия определенной клавиши, чтобы «разбудить» программу. Моя проблема в том, что, хотя мой перехват клавиатуры ниже работает, он захватывает каждую клавишу и останавливает их работу с любой другой программой, пока перехват активен. Есть ли способ передать все ключи, кроме того, который я хочу «разбудить» мою программу? или есть ли лучший/другой способ добиться этого?
Код: Выделить всё
[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)]
[return: MarshalAs(UnmanagedType.Bool)]
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 delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
const int WH_KEYBOARD_LL = 13;
const int WM_KEYDOWN = 0x100;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
private static IntPtr hhook = IntPtr.Zero;
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 static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
if (vkCode.ToString() == "162")
{
UnHook();
Form2 f2 = new Form2();
f2.ShowDialog();
_hookID = SetHook(_proc);
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
public static void UnHook()
{
UnhookWindowsHookEx(_hookID);
}
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
UnHook();
}
private void Form1_Load(object sender, EventArgs e)
{
_hookID = SetHook(_proc);
}
Бен
Подробнее здесь: https://stackoverflow.com/questions/306 ... s-disabled