mz6488
جمعه 22 اسفند 1393, 14:39 عصر
سلام.من میخوام تو برنامه م این قابلیت رو بذارم که کاربر با فشردن کلید f1 تو هرجایی از برنامه بتونه از فرم راهنما استفاده کنه.برای همین اومدم کدهای زیر رو تو تایمر صفحه اصلی گذاشتم.مشکل اینجاس که بعضی وقت ها خوب عمل نمیکنه.اصلا نمیشه دیگه جایی کلیک کرد و باید از task manager استفاده کرد.
// ... { GLOBAL HOOK }
[DllImport("user32.dll")]
static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc callback, IntPtr hInstance, uint threadId);
[DllImport("user32.dll")]
static extern bool UnhookWindowsHookEx(IntPtr hInstance);
[DllImport("user32.dll")]
static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string lpFileName);
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
const int WH_KEYBOARD_LL = 13; // Номер глобального LowLevel-хука на клавиатуру
const int WM_KEYDOWN = 0x100; // Сообщения нажатия клавиши
private LowLevelKeyboardProc _proc = hookProc;
private static IntPtr hhook = IntPtr.Zero;
public void SetHook()
{
IntPtr hInstance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0);
}
public static void UnHook()
{
UnhookWindowsHookEx(hhook);
}
public static IntPtr hookProc(int code, IntPtr wParam, IntPtr lParam)
{
if (code >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
//////ОБРАБОТКА НАЖАТИЯ
if (vkCode.ToString() == "112")
{
UnHook();
tools.Class1.showForm(tools.Class1._frmLearn, "learn");
}
return (IntPtr)1;
}
else
return CallNextHookEx(hhook, code, (int)wParam, lParam);
}
private void tmrLearn_Tick(object sender, EventArgs e)
{
SetHook();
}
این کدها رو از سایت خارجی گرفتم.کد اسکی کلید f1 رو هم ست کردم.فقط کد هگزا رو که زده 0x100 به جاش 0x70 که مربوط هست به کلید f1 ست کردم ولی جواب نداد واس همین دوباره گذاشتم 0x100
// ... { GLOBAL HOOK }
[DllImport("user32.dll")]
static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc callback, IntPtr hInstance, uint threadId);
[DllImport("user32.dll")]
static extern bool UnhookWindowsHookEx(IntPtr hInstance);
[DllImport("user32.dll")]
static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string lpFileName);
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
const int WH_KEYBOARD_LL = 13; // Номер глобального LowLevel-хука на клавиатуру
const int WM_KEYDOWN = 0x100; // Сообщения нажатия клавиши
private LowLevelKeyboardProc _proc = hookProc;
private static IntPtr hhook = IntPtr.Zero;
public void SetHook()
{
IntPtr hInstance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0);
}
public static void UnHook()
{
UnhookWindowsHookEx(hhook);
}
public static IntPtr hookProc(int code, IntPtr wParam, IntPtr lParam)
{
if (code >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
//////ОБРАБОТКА НАЖАТИЯ
if (vkCode.ToString() == "112")
{
UnHook();
tools.Class1.showForm(tools.Class1._frmLearn, "learn");
}
return (IntPtr)1;
}
else
return CallNextHookEx(hhook, code, (int)wParam, lParam);
}
private void tmrLearn_Tick(object sender, EventArgs e)
{
SetHook();
}
این کدها رو از سایت خارجی گرفتم.کد اسکی کلید f1 رو هم ست کردم.فقط کد هگزا رو که زده 0x100 به جاش 0x70 که مربوط هست به کلید f1 ست کردم ولی جواب نداد واس همین دوباره گذاشتم 0x100