Привязка клавиатуры C# — клавиши отключеныC#

Место общения программистов C#
Ответить
Anonymous
 Привязка клавиатуры C# — клавиши отключены

Сообщение Anonymous »

Я не особо разбираюсь в клавиатурных хуках и, возможно, совершенно неправильно понимаю, как их использовать, но надеюсь, что кто-нибудь сможет мне помочь.
Использование некоторых онлайн-руководства и пример кода. Я реализовал перехват клавиатуры. Чтобы моя программа работала, мне нужно сидеть в фоновом режиме и ждать нажатия определенной клавиши, чтобы «разбудить» программу. Моя проблема в том, что, хотя мой перехват клавиатуры ниже работает, он захватывает каждую клавишу и останавливает их работу с любой другой программой, пока перехват активен. Есть ли способ передать все ключи, кроме того, который я хочу «разбудить» мою программу? или есть ли лучший/другой способ добиться этого?

Код: Выделить всё

[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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»