十万火急啊!高分求跪原因!! C# 用全局钩子时也设置成功了,但是一点窗口,窗口就莫名的关闭,求跪原因啊,

Bingo_BIG 2012-11-17 04:55:44
十万火急啊!高分跪求原因!!小弟感激不尽啊!!
C# 用全局钩子时也设置成功了,但是一点窗口,窗口就莫名的关闭,求跪原因啊??
用全局钩子,去读取其它程序窗口中的listView数据
声明:这些代码是在单独的类库中的,钩子已经可以返回句柄了。但就是点击监督的窗口或自己的窗口时就自动关闭窗口。
高手我哪里错了???????

[DllImport("User32.dll")]
public static extern IntPtr SetWindowsHookEx(int idHook, CallbackHookProc lpfn, IntPtr hDLL,Int32 dwThreadId);
[DllImport("User32.dll")]
public static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("User32.dll")]
public static extern int CallNextHookEx(IntPtr hhook, int nCode,uint wParam, int lParam);

public delegate Int32 CallbackHookProc(int nCode, uint wParam, int lParam);
static IntPtr warningHook = IntPtr.Zero;
public int Function_HookProc(int nCode, uint wParam, int lParam)
{
return CallNextHookEx(warningHook,nCode,wParam,lParam);
}
// 安装钩子
public IntPtr Start()
{
if (warningHook == IntPtr.Zero)
{
IntPtr lockHwnd = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);
warningHook = SetWindowsHookEx(4, new CallbackHookProc(Function_HookProc), lockHwnd, 0);//安装钩子
}
return warningHook;
}

// 卸载钩子
public bool Stop()
{
bool b = false;
if (warningHook != IntPtr.Zero)
{
b = UnhookWindowsHookEx(warningHook);
}
return b;
}
...全文
346 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jshi123 2012-11-20
  • 打赏
  • 举报
回复
除了WH_KEYBOARD_LL和WH_MOUSE_LL以外,c#不能安装全局钩子 http://support.microsoft.com/kb/318804
引用
在 .NET 框架中不支持全局挂钩 您无法在 Microsoft .NET 框架中实现全局挂钩。若要安装全局挂钩,挂钩必须有一个本机动态链接库 (DLL) 导出以便将其本身插入到另一个需要调入一个有效而且一致的函数的进程中。这需要一个 DLL 导出,而 .NET 框架不支持这一点。托管代码没有让函数指针具有统一的值这一概念,因为这些函数是动态构建的代理。
Bingo_BIG 2012-11-19
  • 打赏
  • 举报
回复
我也怀疑内在被垃圾回收机制给回收了,因为 电脑提示: “0x????????”指令引用的“0x????????”内存。该内存不能为written 请问朋友如何让回调函数 保持活动呢???
crystal_lz 2012-11-19
  • 打赏
  • 举报
回复
引用 6 楼 lybwwp 的回复:
我也怀疑内在被垃圾回收机制给回收了,因为 电脑提示: “0x????????”指令引用的“0x????????”内存。该内存不能为written 请问朋友如何让回调函数 保持活动呢???
呃 我上面不是有么
crystal_lz 2012-11-18
  • 打赏
  • 举报
回复

if (0 == hHook) {
                HookProc KeyCallBack = new HookProc(MethodHookProc);
                hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyCallBack,
                    GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
                if (hHook == 0) {
                    MessageBox.Show("设置Hook失败");
                } else {
                    button1.Enabled = true;
                    button2.Text = "卸载Hook";
                    gc = GCHandle.Alloc(KeyCallBack);
                }
            } else {
                if (UnhookWindowsHookEx(hHook)) {
                    hHook = 0;
                    button1.Enabled = false;
                    button2.Text = "设置Hook";
                    gc.Free();
                } else {
                    MessageBox.Show("卸载失败");
                }
            }
            MessageBox.Show(hHook.ToString());
这个是当时我的情况
crystal_lz 2012-11-18
  • 打赏
  • 举报
回复
莫非 问题出在回调函数?、、、 以前我就遇到过钩子的问题 不过问题出在回调函数 被 垃圾回收器回收的情况 然后程序就崩溃了 所以后来 让回调函数 保持活动 就搞定了 你试试 我只能说 当时 我是这个情况
Bingo_BIG 2012-11-18
  • 打赏
  • 举报
回复
C#能用全局消息钩子吗???(除了键盘和鼠标的)
Bingo_BIG 2012-11-17
  • 打赏
  • 举报
回复
我用的是WH_CALLWNDPROC(4) 获得其它线程中窗口控件listView的信息列表, 现在是安装成功了,但安装的有问题, 我在网上找的一个键盘全局钩子,是可以运行的,没问题,然后我就是按照键盘的钩子试试,可以安装钩子,但目标窗口或源窗口总是莫名的自动关闭,不知道原因在哪里?? 改成下面这样还是自动关闭窗口 warningHook = SetWindowsHookEx(4, new HookProc(WarningMsg), GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); }

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧