Hooki
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Hooki Expand / Collapse
Автор
Сообщение
08.02.2007 20:16
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 26.06.2007 19:18
Сообщ.: 9, Visits: 35
Народ вот я уже неделю пытаюсь найти нормальный пример работы с хуками, но на всех форумах говорят используй Api  и всё такое, а конкретного, нормального примера нет, мож я конечно плохо искал, терпение подходит к концу и я спрашиваю у вас опытные программеры.

Задача такая, надо независимо от активности winForm проследить нажатие на клавиатуре кнопки и вывести Message со значением нажатой кнопки(включая русские буквы), я так понял это надо делать как-то через хук, но как я совсем не дорубаю. Если кому не сложно выкинте полноценный примерчик (коректно работающий) чтобы при нахатии клавиши "И" выводилась мессага, и желательно с коментоми......

Сообщ. #910604
09.02.2007 11:23
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 26.06.2007 19:18
Сообщ.: 9, Visits: 35
Ну вот вроде я всётаки нашел ссылочку которая перехватывает события нажатия клавишь, но перехватывает оно только английский и даже если нажать Shift и допустим 6, то двоеточье оно не выведет. Кто поопытнее измените плиззз что не так......

using System;

using System.Diagnostics;

using System.Windows.Forms;

using System.Runtime.InteropServices;

class InterceptKeys

{

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);

Console.WriteLine((Keys)vkCode);

}

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)]

[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);

}

Сообщ. #910614
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 11:06