给我也来一份,谢谢
[email protected]
[email protected]
解决方案 »
- C#如何调用系统拨号上网
- 线程执行超时问题
- 有哪位高手在C#中使用过Xtreme Suite Pro ActiveX v9.60,有问题请教,在线等急.............
- 如何通过msbuild 或者nant实现自动生成websetup项目
- 新建c# asp.net web程序时出现以下错误是什么原因,分不够在加
- 急问关于同步进度条的问题
- 我问两个简单的小问题,人人都会,就我不会
- 如何获得指定IP地址的网络工作组及信使名字!
- AForge.Video 摄像头快门事件.求解救.
- C# 如何多次读取数据包
- 三层开发中遇到的sql语句问题(去重复数据)
- 高分找答案,关于楚广明c#简明教程下载地址!
也是调用一堆api,感觉用c#不是很适合,用vc++非托管代码比较合适,毕竟不能保证客户端安装了framework
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;namespace WindowsApplication1
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class Form4 : Form
{ //委托
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
static int hHook = 0;
public const int WH_KEYBOARD_LL = 13;
//LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。
HookProc KeyBoardHookProcedure;
//键盘Hook结构函数
[StructLayout(LayoutKind.Sequential)]
public class KeyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
#region DllImport
//设置钩子
[DllImport("user32.dll")]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
//抽掉钩子
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll")]
//调用下一个钩子
public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam); [DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId(); [DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name); #endregion
#region 自定义事件
public void Hook_Start()
{
// 安装键盘钩子
if (hHook == 0)
{
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc); //hHook = SetWindowsHookEx(2,
// KeyBoardHookProcedure,
// GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId()); hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
KeyBoardHookProcedure,
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); //如果设置钩子失败.
if (hHook == 0)
{
Hook_Clear();
//throw new Exception("设置Hook失败!");
}
}
} //取消钩子事件
public void Hook_Clear()
{
bool retKeyboard = true;
if (hHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hHook);
hHook = 0;
}
//如果去掉钩子失败.
if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
} //这里可以添加自己想要的信息处理
public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
//if (kbh.vkCode == (int)Keys.S && (int)Control.ModifierKeys == (int)Keys.Control) // 截获F8
//{
// MessageBox.Show("快捷键已拦截!不能保存!");
// return 1; //}
//if (kbh.vkCode == (int)Keys.Delete
// && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+Y
//{ // MessageBox.Show("!DeleteDeleteDeleteDeleteDelete");
// return 1;
//}
//if (kbh.vkCode == (int)Keys.X)
//{
// MessageBox.Show("不能全部保存!");
// return 1;
//}
return 0;
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
#endregion public Form4()
{ InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Hook_Start();
} private void button2_Click(object sender, EventArgs e)
{
Hook_Clear();
}
}
}
第二 普通的钩子无法屏蔽alt ctrl del组合键
可惜我对C++不怎么了解以前只是接触 过不过我不介意你发过来我看看API里的参数修改谢谢
framwork将其也打包进去不过一个framwork就占好几十MB了现在要是叫我去再研究C++/VC++,那恐怕,我没这个劲了怎么说要精一样了解多样。而不可能样样精通样样精通说白了,其实就是样样都不精通。呵呵
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection ;
using System.Runtime .InteropServices ;
using System.Diagnostics;
namespace Hook
{
public partial class Form1 : Form
{ private string str = "";
[StructLayout (LayoutKind .Sequential)]
public struct KeyInfo
{
public UInt32 vkCode;
public UInt32 scanCode;
public UInt32 flags;
public UInt32 time;
public IntPtr extraInfo; } public delegate int HookProc(int idcode,IntPtr wparam,IntPtr lparam);
public HookProc HookEvent;
private IntPtr HHook = IntPtr.Zero; public Form1()
{
InitializeComponent();
}
[DllImport("User32.dll")]
private extern static IntPtr SetWindowsHookEx(int hooktype,HookProc lpfun, IntPtr instance, int threadid);
[DllImport("User32.dll")]
private extern static int CallNextHookEx(IntPtr hook, int idcode, IntPtr wparam, IntPtr lparam);
[DllImport("User32.dll")]
private extern static int UnhookWindowsHookEx(IntPtr hook);
} private int HookFun(int idcode, IntPtr wparam, IntPtr lparam)
{ KeyInfo kf = (KeyInfo) Marshal.PtrToStructure(lparam ,typeof (KeyInfo));
int i = this.GetRemoteProcessId();
label2.Text = i.ToString();
if (i != 0)
label2.Text =((Keys)kf.vkCode).ToString ();
str += ((Keys)kf.vkCode).ToString();
this.textBox1.Text = str;
return CallNextHookEx(HHook, idcode, wparam, lparam);
} private void InstallHook()
{ HookEvent = new HookProc(HookFun); if (HHook == IntPtr.Zero)
{
try
{ HHook = SetWindowsHookEx(13, HookEvent, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly ().GetModules ()[0]), 0);
label1.Text = "Install sucess "+HHook .ToString ();
}
catch (Exception e)
{
MessageBox.Show("Set Hook failed!"+e.Message .ToString ()); }
} } private void UnInstalHook()
{ if (HHook != IntPtr.Zero)
{
try
{ UnhookWindowsHookEx(HHook);
label1.Text = "UnInstall Sucess";
label2.Text = "";
textBox1.Text = "";
HHook = IntPtr.Zero;
} catch (Exception e)
{ MessageBox.Show("UnInStall Failed!" + e.Message.ToString()); } } else
{
label1.Text = "Hook already UnInstall or No Install Hook!"; } }
private void Form1_Load(object sender, EventArgs e)
{ } private void button2_Click(object sender, EventArgs e)
{
this.UnInstalHook();
} private void Button1_Click(object sender, EventArgs e)
{ this.InstallHook(); } protected override void OnFormClosed(FormClosedEventArgs e)
{
base.OnFormClosed(e); if (HHook != IntPtr.Zero)
{
this.UnInstalHook();
}
} }
}
//HOOK 只要要调用API就可以实现了;
/*
主要代码就: [StructLayout (LayoutKind .Sequential)]
public struct KeyInfo
{
public UInt32 vkCode;
public UInt32 scanCode;
public UInt32 flags;
public UInt32 time;
public IntPtr extraInfo; }要安装为全局钩子,就考这段代码了;得到要映射到进程的文件的句柄,因为钩子函数在当前文件中所以就是当前文件的句柄了。
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly ().GetModules ()[0];public delegate int HookProc(int idcode,IntPtr wparam,IntPtr lparam);
public HookProc HookEvent;注意调试的时候都不能正常执行,但是找到当前文件路径下的debug下的exe文件点击运行可以正常运行。*/
你的代码不完整。无法测试。HookProc委托没有找到。