C# 带UI的全局键/鼠标指针
我想制作一个屏幕上有键盘和鼠标的C#应用程序。C# 带UI的全局键/鼠标指针,c#,user-interface,global,mouse-hook,keyhook,C#,User Interface,Global,Mouse Hook,Keyhook,我想制作一个屏幕上有键盘和鼠标的C#应用程序。 在这个应用程序中,单击的每个键或按钮都应该通过对其中一个键着色(我知道怎么做)来查看。如果应用程序没有重点,这也应该起作用目前,我使用的是一个全局键和鼠标本,效果很好。 问题是,Keyhook一次只截取一个键,这意味着我一次只能在键上显示。我希望能够在屏幕上一次显示多个键。 不幸的是,KeyListener没有选择,因为它们不在应用程序之外工作。 有人知道如何使这成为可能吗 这是我正在使用的钥匙钩: public class KeyHook {
在这个应用程序中,单击的每个键或按钮都应该通过对其中一个键着色(我知道怎么做)来查看。如果应用程序没有重点,这也应该起作用
目前,我使用的是一个全局键和鼠标本,效果很好。
问题是,Keyhook一次只截取一个键,这意味着我一次只能在键上显示。我希望能够在屏幕上一次显示多个键。 不幸的是,KeyListener没有选择,因为它们不在应用程序之外工作。 有人知道如何使这成为可能吗 这是我正在使用的钥匙钩:
public class KeyHook
{
private delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
static int hHook = 0;
public static List<Keys> KeyCodes = new List<Keys>();
const int WH_KEYBOARD_LL = 13;
HookProc KeyboardHookProcedure;
[StructLayout(LayoutKind.Sequential)]
private class keyboardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern int SetWindowsHookEx(int idHook, HookProc lpfn,
IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern int CallNextHookEx(int idHook, int nCode,
IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string lpFileName);
public KeyHook()
{
Hook();
}
~KeyHook()
{
UnHook();
}
public int Hook()
{
KeyboardHookProcedure = new HookProc(KeyHook.KeyboardHookProc);
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, (IntPtr)LoadLibrary("User32"), 0);
return hHook;
}
public bool UnHook()
{
bool ret = UnhookWindowsHookEx(hHook);
if (ret)
hHook = 0;
return ret;
}
private static int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode < 0)
{
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
else
{
if (((int)wParam == 256) || ((int)wParam == 260))
{
keyboardHookStruct MyKeyboardHookStruct = (keyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(keyboardHookStruct));
//Adding Key to a log i use for other stuff
KeyCodes.Add((Keys)MyKeyboardHookStruct.vkCode);
//Code for coloring Key in the UI for pressed Key
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
}
}
公共类KeyHook
{
私有委托int-HookProc(int-nCode、IntPtr-wParam、IntPtr-lParam);
静态int hHook=0;
公共静态列表键代码=新列表();
const int WH_键盘LL=13;
HookProc键盘hookprocedure;
[StructLayout(LayoutKind.Sequential)]
私有类keyboardHookStruct
{
公共int-vkCode;
公共int扫描码;
公共国旗;
公共整数时间;
公共信息;
}
[DllImport(“user32.dll”,CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
私有静态外部int SetWindowsHookEx(int idHook、HookProc lpfn、,
IntPtr hInstance,int threadId);
[DllImport(“user32.dll”,CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
私有静态外部bool unhookwindowshookx(intidhook);
[DllImport(“user32.dll”,CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
私有静态外部内部调用nexthookex(内部idHook,内部nCode,
IntPtr wParam、IntPtr lParam);
[DllImport(“kernel32.dll”)]
静态外部IntPtr加载库(字符串lpFileName);
公钥挂钩()
{
钩子();
}
~KeyHook()
{
解开钩();
}
公共int Hook()
{
KeyboardHookProcedure=新的HookProc(KeyHook.KeyboardHookProc);
hHook=SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardHookProcedure,(IntPtr)加载库(“User32”),0);
返回hHook;
}
公共bool UnHook()
{
bool-ret=unhookwindowshookx(hHook);
如果(ret)
hHook=0;
返回ret;
}
私有静态int KeyboardHookProc(int nCode、IntPtr wParam、IntPtr lParam)
{
if(nCode<0)
{
返回CallNextHookEx(hHook、nCode、wParam、lParam);
}
其他的
{
如果((int)wParam==256)| |((int)wParam==260))
{
keyboardHookStruct MyKeyboardHookStruct=(keyboardHookStruct)Marshal.PtrToStructure(lParam,typeof(keyboardHookStruct));
//将密钥添加到用于其他内容的日志
添加((键)MyKeyboardHookStruct.vkCode);
//在用户界面中为按键着色的代码
}
返回CallNextHookEx(hHook、nCode、wParam、lParam);
}
}
}
很奇怪,你用C语言编程,但是使用了旧的Win32的东西,你可以很容易地用C++ C++编码。“问题是,Keyhook一次只截取一个键,这意味着我一次只能在键上显示。我希望能够在屏幕上一次显示多个键。“尽管钩子一次只截取一个键,但你不能跟踪哪些键被按下并同时显示所有键吗?”我问道“,还是在互联网上闲逛?你找到的代码有多旧?小心你没有发现古老的代码并认为这是做事情的正确方式。@Sam也许我可以,但不知怎的,我什么都没想到。。