求c# 鼠标钩子单击事件钩子代码

C#怎么判断鼠标在窗体外点击事件?_百度知道
C#怎么判断鼠标在窗体外点击事件?
在窗体外点击就不能检测了类似于Form_MouseClick(object sender,有没有什么办法能检测鼠标在窗体外点击呢, MouseEventArgs e)但这个只能在窗体中点击才能检测到
提问者采纳
1.baidu.baidu、以管理员身份运行2.jpg" />刚又测试了一下.hiphotos.hiphotos、非管理员运行<img class="ikqb_img" src="/zhidao/wh%3D450%2C600/sign=/zhidao/wh%3D600%2C800/sign=8aaa44de003b5bb5bef901/b21cd685e1ee6afd20参照楼上的回答实现了一下
提问者评价
来自团队:
其他类似问题
为您推荐:
其他2条回答
你的窗体外是嵌套iframe还是弹出一个框要外侧关闭?如果这种的话你可以用parent父模板直接写div或者body点击事件就好了
全局鼠标钩子,监听鼠标事件。实例代码查前面关键字就有。
是这样吗,但MouseHook是不是要加using引用啊,怎么加呢,不然出错的。
这个MouseHook哪来的?谁写的自定义类吧。没类定义
不知道啊,百度上看到的。那全局鼠标钩子怎么用呢,能写几句吗
鼠标的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁钩子 C#用钩子获得按键信息实例 - 为程序员服务
为程序员服务
C#用钩子获得按键信息实例
窗体相关代码:
using System.Collections.G
using System.D
using System.D
using System.L
using System.T
using System.Windows.F
using System.Runtime.InteropS
using System.T
using ReadBadC
namespace gouzi
public partial class Form2 : Form
BarCodeHook BarCode = new BarCodeHook();
public Form2()
InitializeComponent();
BarCode.BarCodeEvent += new BarCodeHook.BarCodeDelegate(BarCode_BarCodeEvent);
private delegate void ShowInfoDelegate(BarCodeHook.BarCodes barCode);
private void ShowInfo(BarCodeHook.BarCodes barCode)
if (this.InvokeRequired)
this.BeginInvoke(new ShowInfoDelegate(ShowInfo), new object[] { barCode });
textBox1.Text = barCode.KeyN//键名
textBox2.Text = barCode.VirtKey.ToString();//虚拟码
textBox3.Text = barCode.ScanCode.ToString();//扫描码
textBox4.Text = barCode.AscII.ToString();//AscII
textBox5.Text = barCode.Chr.ToString();//字符
textBox6.Text = barCode.IsValid ? barCode.BarCode : &&;//在这里进行键入值
void BarCode_BarCodeEvent(BarCodeHook.BarCodes barCode)
ShowInfo(barCode);
private void Form2_Load(object sender, EventArgs e)
BarCode.Start();
private void Form2_StyleChanged(object sender, EventArgs e)
BarCode.Stop();
............................................................................................................................................
后台类代码
using System.Collections.G
using System.L
using System.T
using System.Runtime.InteropS
using System.R
namespace ReadBadCode
class BarCodeHook
public delegate void BarCodeDelegate(BarCodes barCode);
public event BarCodeDelegate BarCodeE
public struct BarCodes
public int VirtK
public int ScanC
public string KeyN
public uint AscII;
public char C
public string BarC
//条码信息
public bool IsV
//条码是否有效
public DateTime T
//扫描时间
private struct EventMsg
public int paramL;
public int paramH;
public int T
// 安装钩子
[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, Int32 wParam, IntPtr lParam);
//获取键名的字符串
[DllImport(&user32&, EntryPoint = &GetKeyNameText&)]
private static extern int GetKeyNameText(int lParam, StringBuilder lpBuffer, int nSize);
//将256个虚拟键复制到指定的缓冲区中
[DllImport(&user32&, EntryPoint = &GetKeyboardState&)]
private static extern int GetKeyboardState(byte[] pbKeyState);
//将指定的虚拟键码和键盘状态为相应的字符串
[DllImport(&user32&, EntryPoint = &ToAscii&)]
private static extern bool ToAscii(int VirtualKey, int ScanCode, byte[] lpKeyState, ref uint lpChar, int uFlags);
//声明定义回调函数
delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
BarCodes barCode = new BarCodes();
int hKeyboardHook = 0;
string strBarCode = &&;
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
if (nCode == 0)
EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam, typeof(EventMsg));
if (wParam == 0x100)
//WM_KEYDOWN = 0x100
barCode.VirtKey = msg.message & 0
barCode.ScanCode = msg.paramL & 0
StringBuilder strKeyName = new StringBuilder(255);
if (GetKeyNameText(barCode.ScanCode * 65536, strKeyName, 255) & 0)
barCode.KeyName = strKeyName.ToString().Trim(new char[] { ' ', '\0' });
barCode.KeyName = &&;
byte[] kbArray = new byte[256];
uint uKey = 0;
GetKeyboardState(kbArray);
if (ToAscii(barCode.VirtKey, barCode.ScanCode, kbArray, ref uKey, 0))
barCode.AscII = uK
barCode.Chr = Convert.ToChar(uKey);
if (DateTime.Now.Subtract(barCode.Time).TotalMilliseconds & 50)
strBarCode = barCode.Chr.ToString();
if ((msg.message & 0xff) == 13 && strBarCode.Length & 3)
barCode.BarCode = strBarC
barCode.IsValid =
strBarCode += barCode.Chr.ToString();
barCode.Time = DateTime.N
if (BarCodeEvent != null) BarCodeEvent(barCode);
//触发事件
barCode.IsValid =
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
// 安装钩子
public bool Start()
if (hKeyboardHook == 0)
//WH_KEYBOARD_LL = 13
hKeyboardHook = SetWindowsHookEx(13, new HookProc(KeyboardHookProc), Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
return (hKeyboardHook != 0);
// 卸载钩子
public bool Stop()
if (hKeyboardHook != 0)
return UnhookWindowsHookEx(hKeyboardHook);
【注意】要想测试实际的效果,必须执行编译后的Exe文件,在开发环境直接运行会没有效果的。
您可能的代码
相关聚客文章
相关专栏文章c#鼠标钩子问题_百度知道
c#鼠标钩子问题
其他就没别的功能了,我想实现单击鼠标左键就变成单击了右键从网上找来的代码,怎么写,程序已能获取鼠标坐标
[StructLayout(LayoutK
public int y,就说鼠标钩子怎么捕获鼠标单击事件.Sequential)]
public class POINT
public int x? [StructLayout(LayoutKind??.Sequential)]
public class MouseHookStruct
public POINT
public int dwExtraI
public int wHitTestCode换个问法吧
提问者采纳
UIntPtr extraInfo),
RightDown = 0x0008,
RightUp = 0x0010,
Wheel = 0x0800, int dy: uint
Move = 0x0001。如果仅是恶作剧的话,
XUp = 0x0100, uint data,)]
static extern void mouse_event(MouseEventFlag flags,
MiddleDown = 0x0020;enum MouseEventFlag 。
[DllImport(&quot,
XDown = 0x0080。鼠标钩子,
MiddleUp = 0x0040用mouse_event发送鼠标右键事件,修改右手鼠标为左手鼠标就行了,
LeftDown = 0x0002.dll&user32,八成会被杀毒软件干掉,
VirtualDesk = 0x4000,
LeftUp = 0x0004
你这个只能模拟鼠标事件啊,比如mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);我问的是怎么“捕获”鼠标事件,程序得知道我什么时候按了右键。。。例如:if(捕获到鼠标右键){mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);}
看你抓住坐标,还以为你顺便把点击也搞定了呢。网上有个鼠标键盘钩子的类。你找找吧。直接对鼠标点击事件编程就行了。
提问者评价
其他类似问题
为您推荐:
您可能关注的推广
钩子的相关知识
其他1条回答
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁c# 钩子程序
c# 钩子程序 20
应用界面代码:&&&&& namespace myHookTest{&&& public partial class Form1 : Form&&& {&&&&&&& KeyHook keyhook& = new KeyHook();&&&&&&& public Form1()&&&&&&& {&&&&&&&&&&& InitializeComponent();&&&&&&&&& &&&&&&& }&&&&&&& private void Form1_Load(object sender, EventArgs e)&&&&&&& {&&&&&&&&&&& MessageBox.Show("test");&&&&&&&&&&& keyhook.keyDown +=new KeyEventHandler(keyhook_keyDown);&&&&&&&&&&& keyhook.Start();&&&&&&& }&&&&&&& void keyhook_keyDown(object sender, KeyEventArgs e) {&&&&&&&&&&& MessageBox.Show("KeyDown_" + e.KeyCode.ToString());&&&&&&& }&&& }}处理键盘事件钩子代码namespace myHookTest{&&& class KeyHook : HookBase&&& {&&&&&&& //定义键盘按下响应事件&&&&&&& public event KeyEventHandler keyD&&&&&&& protected int _hookT&&&&&&& protected const int WH_KEYBOARD_LL = 13;&&&&&&& protected const byte VK_CAPITAL = 0x14;&&&&&&& protected const int WM_SYSKEYDOWN = 0x104;&&&&&&& protected& bool _isS&&&&&&& protected int _handleToH&&&&&&& protected const int WM_KEYDOWN = 0x100;&&&&&&& [StructLayout(LayoutKind.Sequential)]&&&&&&& protected class KeyboardHookStruct//键盘hook结构函数&&&&&&& {&&&&&&&&&&& public int vkC&&&&&&&&&&& public int scanC&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public int dwExtraI&&&&&&& }&&&&&&& //设置钩子程序的引用&&&&&&& [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]&&&&&&& protected static extern int SetWindowsHookEx(&&&&&&&&&&& int idHook,&&&&&&&&&&& HookProc lpfn,&&&&&&&&&&& IntPtr hMod,&&&&&&&&&&& int dwThreadId);&&&&&&& //抽掉钩子&&&&&&& [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]&&&&&&& public static extern bool UnhookWindowsHookEx(int idHook);&&&&&&& [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]&&&&&&& //调用下一个钩子&&&&&&& public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);&&&&&&& //钩子程序截获到用户对键盘鼠标的操作处理后,处理完后,把其参数传给目标行数&&&&&&& [DllImport("user32.dll", CharSet = CharSet.Auto,&&&&&&&&&&&& CallingConvention = CallingConvention.StdCall)]&&&&&&& protected static extern int CallNextHookEx(&&&&&&&&&&& int idHook,&&&&&&&&&&& int nCode,&&&&&&&&&&& int wParam,&&&&&&&&&&& IntPtr lParam);&&&&&&& [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]&&&&&&& protected static extern short GetKeyState(int vKey);&&&&&&& //用delegate委托来实现指针功能&&&&&&& protected delegate int HookProc(int nCode, int wParam, IntPtr lParam);&&&&&&& protected HookProc _hookC&&&&&&& public KeyHook() {&&&&&&& }&&&&&&& protected int keyHookCallBackProcedure(int nCode, int wParem, IntPtr lParam) {&&&&&&&&&&& Console.WriteLine("函数被调用了~~~~~~~~~~~~~~~");&&&&&&&&&&& if (nCode & -1 && keyDown != null)&&&&&&&&&&& {&&&&&&&&&&&&&&& KeyboardHookStruct keyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));&&&&&&&&&&&&&&& switch (wParem)&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&& case WM_KEYDOWN:&&&&&&&&&&&&&&&&&&& case WM_SYSKEYDOWN:&&&&&&&&&&&&&&&&&&&&&&& if (keyDown != null)&&&&&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&&& Console.WriteLine("有键盘的键被按下了");&&&&&&&&&&&&&&&&&&&&&&&&& //& keyDown(this, e);&&&&&&&&&&&&&&&&&&&&&&&&&&& //keyDown =&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&&&&&&&&& return 0;&&&&&&& }&&&&&&& public void Start()&&&&&&& {&&&&&&&&&&& _hookCallback = new HookProc(keyHookCallBackProcedure);&&&&&&&&&&& _handleToHook = SetWindowsHookEx(&&&&&&&&&&&&&&&&&& WH_KEYBOARD_LL,&&&&&&&&&&&&&&&&&& _hookCallback,//代理方法&&&&&&&&&&&&&&&&&& Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),&&&&&&&&&&&&&&&&&& 0);&&&&&&&&&&& if (_handleToHook != 0)&&&&&&&&&&& {&&&&&&&&&&&&&&& Console.WriteLine("设置钩子成功");&&&&&&&&&&& }&&&&&&&&&&& else {&&&&&&&&&&&&&&& Console.WriteLine("设置钩子不成功");&&&&&&&&&&& }&&&&&&& }&&&&&&& protected void Application_ApplicationExit(object sender, EventArgs e)&&&&&&& {&&&&&&&&&&& if (_isStarted)&&&&&&&&&&& {&&&&&&&&&&&&& //& Stop();&&&&&&&&&&& }&&&&&&& }&&& }}我在调用api设置钩子的时候老是设置不成功,设置钩子的方法在Start()中,应该是我参数不正确,请高手指点
C#写HOOK还是延续WINDOWS HOOK的思路的,使用标准的API :SetWindowHookEx....思路很简单:写个类自己定义一个钩子事件然后再自己程序中调用,下面是我以前写的一个NET HOOK框架,网上相关资源也是很多的======================================写多了其他语言实现的HOOK,突然很想写个不一样的,想来想去Net HOOK是最合适的了使用的方法还是传统的 Gui‘Thread Hook : SetWindowsHookEx/CallNextHookExHOOK -- 拦截,一种改变程序执行流程的技术手段,这里我不想过多的去谈如果去改变一个程序的执行流程只是简单的演示下,如何实现一个HOOK在Net里面实现挂钩和在其他语言实现虽然在本质上是相同的,但细节上却是有点不同的NET 采用的是事件驱动(消息机制的封装版),所有要实现一个消息的拦截,你必须实现一个事件,而该事件的作用就是接受和处理=======================================1。开始我们定义一个基础类,实现一些基本的方法和变量namespace Mr.Krcl.BaseHookLibrary&& // ==================================================================&& // 挂钩的消息类型,具体查阅MSDN&& public enum HookType : int&& &// ====================================================================&// 导出API : 最烦人的工作了,不像C/C++其他语言直接调用头文件就OK&&& [DllImport("user32.dll")]&&protected static extern IntPtr SetWindowsHookEx(HookType code, &&&HookProc func,&&&IntPtr hInstance,&&&int threadID);&&&&[DllImport("user32.dll")]&&protected static extern int UnhookWindowsHookEx(IntPtr hhook); &&&&[DllImport("user32.dll")]&&protected static extern int CallNextHookEx(IntPtr hhook, &&&int code, IntPtr wParam, IntPtr lParam);&&&// ====================================================================&// HOOK基类&public abstract class BaseHookLib:IDisposable&&public BaseHookLib(HookType hType , CallBaseHookProc proc)&&&&&// 内部变量&&protected IntPtr _hhook = IntPtr.Z&&&&&&& // 判断系统是否已经加载HOOK&&protected bool _isHook = &&// 回调函数&&protected C
相关知识等待您来回答
编程领域专家
& &SOGOU - 京ICP证050897号

我要回帖

更多关于 delphi 鼠标钩子 的文章

 

随机推荐