发现c#调用api不能用啊!SetWindowsHookEx总是返回0。高手请帮忙看看!
//定义委托(钩子函数,用于回调)
public delegate int HookProc(int code, int wParam, IntPtr lParam);
//安装钩子的函数
//[DllImport("User32.dll",CharSet = CharSet.Auto)]
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, int dwThreadId);
//public static extern int SetWindowsHookEx(int type, HookProc hook, IntPtr instance, IntPtr threadID);
//调用下一个钩子的函数
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int CallNextHookEx(IntPtr hookHandle, int code, int wParam, IntPtr lParam);
//卸载钩子
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool UnhookWindowsHookEx(IntPtr hookHandle); [DllImport("user32.dll")]
static extern IntPtr FindWindow(string s, string WindowCaption); //获取窗体线程ID
// [DllImport("User32.dll",CharSet = CharSet.Auto)]
//public static extern int GetWindowThreadProcessId(IntPtr hwnd, IntPtr ID);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, int processid); [DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow(); [DllImport("kernel32")]
public static extern int GetCurrentThreadId();
private HookProc hookProc;
private IntPtr hookHandle;
string proname = "notepad";
pro = System.Diagnostics.Process.GetProcessesByName(proname);
//pro1 = System.Diagnostics.Process.GetCurrentProcess();
if (pro[0] == null)
{
return;
}
this.hookHandle = pro[0].MainWindowHandle;//这里不管是用Handle属性还是MainWindowHandle都不行!
//hookHandle = FindWindow(null, pro[0].MainWindowTitle);
ProcId = pro[0].Id;
// this.Text = "Game name:" + pro[0].ProcessName + "ID" + pro[0].Id;
this.hookProc = new HookProc(myhookproc); StartHook();//此处主要用来让窗口置于最前(SetWindowPos(this.Handle,-1,0,0,0,0,0x4000|0x0001|0x0002);)
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd,
int hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
int uFlags
); //开始拦截
private void StartHook()
{
//idHook 钩子类型,即确定钩子监听何种消息,上面的代码中设为2,即监听键盘消息并且是线程钩子,如果是全局钩子监听键盘消息应设为13,线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14。
//安装钩子,拦截系统向Form2发出的消息
//hookHandle = FindWindow(null, pro[0].MainWindowTitle);
//hookHandle = GetForegroundWindow(); ;
bool setPos = SetWindowPos(hookHandle, 0, 0, 0, 0, 0, 0x4000 | 0x0001 | 0x0002);
int threadid = GetWindowThreadProcessId(this.hookHandle, 0);
int t = SetWindowsHookEx(2, hookProc, IntPtr.Zero, threadid);
// System.Threading.Thread.Sleep(3000);
//int t = SetWindowsHookEx(2, hookProc, IntPtr.Zero, ProcId);
MessageBox.Show("hook" + t.ToString() + "zzzz" + threadid.ToString());
//return (this.hookHandle != null);
}
//定义委托(钩子函数,用于回调)
public delegate int HookProc(int code, int wParam, IntPtr lParam);
//安装钩子的函数
//[DllImport("User32.dll",CharSet = CharSet.Auto)]
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, int dwThreadId);
//public static extern int SetWindowsHookEx(int type, HookProc hook, IntPtr instance, IntPtr threadID);
//调用下一个钩子的函数
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int CallNextHookEx(IntPtr hookHandle, int code, int wParam, IntPtr lParam);
//卸载钩子
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool UnhookWindowsHookEx(IntPtr hookHandle); [DllImport("user32.dll")]
static extern IntPtr FindWindow(string s, string WindowCaption); //获取窗体线程ID
// [DllImport("User32.dll",CharSet = CharSet.Auto)]
//public static extern int GetWindowThreadProcessId(IntPtr hwnd, IntPtr ID);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, int processid); [DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow(); [DllImport("kernel32")]
public static extern int GetCurrentThreadId();
private HookProc hookProc;
private IntPtr hookHandle;
string proname = "notepad";
pro = System.Diagnostics.Process.GetProcessesByName(proname);
//pro1 = System.Diagnostics.Process.GetCurrentProcess();
if (pro[0] == null)
{
return;
}
this.hookHandle = pro[0].MainWindowHandle;//这里不管是用Handle属性还是MainWindowHandle都不行!
//hookHandle = FindWindow(null, pro[0].MainWindowTitle);
ProcId = pro[0].Id;
// this.Text = "Game name:" + pro[0].ProcessName + "ID" + pro[0].Id;
this.hookProc = new HookProc(myhookproc); StartHook();//此处主要用来让窗口置于最前(SetWindowPos(this.Handle,-1,0,0,0,0,0x4000|0x0001|0x0002);)
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd,
int hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
int uFlags
); //开始拦截
private void StartHook()
{
//idHook 钩子类型,即确定钩子监听何种消息,上面的代码中设为2,即监听键盘消息并且是线程钩子,如果是全局钩子监听键盘消息应设为13,线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14。
//安装钩子,拦截系统向Form2发出的消息
//hookHandle = FindWindow(null, pro[0].MainWindowTitle);
//hookHandle = GetForegroundWindow(); ;
bool setPos = SetWindowPos(hookHandle, 0, 0, 0, 0, 0, 0x4000 | 0x0001 | 0x0002);
int threadid = GetWindowThreadProcessId(this.hookHandle, 0);
int t = SetWindowsHookEx(2, hookProc, IntPtr.Zero, threadid);
// System.Threading.Thread.Sleep(3000);
//int t = SetWindowsHookEx(2, hookProc, IntPtr.Zero, ProcId);
MessageBox.Show("hook" + t.ToString() + "zzzz" + threadid.ToString());
//return (this.hookHandle != null);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货