C#如何捕捉系统新增的窗口句柄

路过的菜鸟 2014-08-22 04:16:18
我想使用C#捕捉在系统中运行的程序弹出的窗口句柄。

例如:我刚刚开电脑,我运行QQ程序,此时我写的程序就提示QQ在运行并且获取其句柄;然后我又打开work文档,我写的程序再提示work在运行并且获取该窗口的句柄。打开的程序都是随意的,并没有一定的顺序。

我想应该在消息队列中做文章吧,但是我不知道怎么搞,请牛人指教!!

...全文
279 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
路过的菜鸟 2014-08-22
  • 打赏
  • 举报
回复
引用 12 楼 dongxinxi 的回复:
给你个参考吧,主要代码都在里面,你要改就是拦的code不一样 http://www.yesky.com/325/1826325_3.shtml 代码下载:http://www.yesky.com/imagesnew/software/0511/18/gouzi.zip
还是C++比较牛,啥都可以做!我研究研究先,看看能不能搞个C#的,如果行,就给你分
zhouzangood 2014-08-22
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
给你个参考吧,主要代码都在里面,你要改就是拦的code不一样 http://www.yesky.com/325/1826325_3.shtml 代码下载:http://www.yesky.com/imagesnew/software/0511/18/gouzi.zip
路过的菜鸟 2014-08-22
  • 打赏
  • 举报
回复
引用 8 楼 dongxinxi 的回复:
用VS挂全局钩子,应该是挂接在CreateWindow一类的函数上,这个函数返回的正是新窗口的句柄,但是创建和显示应该是两回事,所以感觉还需要挂接ShowWindow之类的函数
亲,有现成的例子参考一下吗?
  • 打赏
  • 举报
回复
public enum HookCode { HSHELL_WINDOWCREATED = 1, HSHELL_WINDOWDESTROYED = 2, HSHELL_WINDOWACTIVATED = 4 } public void InstallHook(OnTopWindowCreated windowCreatedHandler) { if (windowCreatedHandler == null) { throw new ArgumentNullException("Handler of created window"); } this.appWindowHookHandler = new HookProc(AppWindowHookHandler); this.hHook = Win32API.InstallHook((int)HookType.WH_SHELL, this.appWindowHookHandler); if (this.hHook == IntPtr.Zero) { throw new Win32Exception(Marshal.GetLastWin32Error(), "Errors occured while Installing HOOK!"); } } IntPtr AppWindowHookHandler(int code, IntPtr wParam, IntPtr lParam) { //如果有新的应用程序窗口创建 if (code == (int)HookCode.HSHELL_WINDOWCREATED) { ProcessHandle hProcess = new ProcessHandle(); hProcess.Handle = wParam; var exeFile = new StringBuilder(FILE_NAME_LENGTH); Win32API.GetModuleFileName(wParam, exeFile, FILE_NAME_LENGTH); hProcess.ProcessName = System.IO.Path.GetFileNameWithoutExtension(exeFile.ToString()); Win32API.GetWindowThreadProcessId(wParam, out hProcess.PID); 句柄、PID、进程名都有了 } return IntPtr.Zero; // CallNextHookEx(this.hHook, code, wParam, lParam); } 挂的HookType.WH_SHELL钩子,试了好像是不行,用C++写的就可以
  • 打赏
  • 举报
回复
得用C++做
  • 打赏
  • 举报
回复
用VS挂全局钩子,应该是挂接在CreateWindow一类的函数上,这个函数返回的正是新窗口的句柄,但是创建和显示应该是两回事,所以感觉还需要挂接ShowWindow之类的函数
路过的菜鸟 2014-08-22
  • 打赏
  • 举报
回复
引用 1 楼 LoveNet_ 的回复:
这个用VC好些吧
VC怎么做到?能来点代码吗?我想参考一下!!谢谢!
路过的菜鸟 2014-08-22
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
获取窗口,靠谱么... 不行遍历进程吧
你的意思是先把现有的进程放进数组,然后单位时间间隔去比较哪个进程是新增的再获取该新增窗口的句柄? 能不能不使用时间时隔的方式,我想要监视的方式!还有其它办法吗?
於黾 2014-08-22
  • 打赏
  • 举报
回复
引用 4 楼 lin202 的回复:
[quote=引用 3 楼 terry_88888 的回复:] Process process = Process.GetProcessesByName("QQ.exe"); IntPtr handle = id.MainWindowHandle;
我想任意一个程序在任何时间弹出我都能知道,而不是先知道程序名再获取句柄!![/quote] 维护个数组,记录当前的进程列表 定时去列表里取,跟数组里比较,有新的,就获取句柄
路过的菜鸟 2014-08-22
  • 打赏
  • 举报
回复
引用 3 楼 terry_88888 的回复:
Process process = Process.GetProcessesByName("QQ.exe"); IntPtr handle = id.MainWindowHandle;
我想任意一个程序在任何时间弹出我都能知道,而不是先知道程序名再获取句柄!!
terry_88888 2014-08-22
  • 打赏
  • 举报
回复
Process process = Process.GetProcessesByName("QQ.exe"); IntPtr handle = id.MainWindowHandle;
於黾 2014-08-22
  • 打赏
  • 举报
回复
获取窗口,靠谱么... 不行遍历进程吧
LoveNet_ 2014-08-22
  • 打赏
  • 举报
回复
这个用VC好些吧
支持sql2000,oracle 10g 1、左侧列出所有表名,右键选择表名,可以查看表内数据。由于考虑表名太多的情况下,会提示内存不够,或者创建窗口句柄失败等问题暂时无法解决,用了这种办法,先列出表名,等用户单击表名,再绑定表内字段。 2、双击左侧数据表或字段,再sql语句中自动添加。 3、输入sql语句时,自动提醒关键字和表名,点击空格或回车自动完成,基本是模拟VS2005的风格和用法。 4、系统自动判断关键字,然后会相应的染色。 5、输入表名后,点.,可以带出此表名中的字段名。 6、点击【执行】,进行查询,原则上支持复杂SQL语句,和关联表查询。 7、点击登陆,可以重新指定数据库连接。 8,查询菜单下有个【清理垃圾表】,是针对oracle中的回收站功能设定的,可以删去此方案中回收站中的表BIN$啥啥的。 输入时有闪动的问题暂时没能完美解决。 时间仓促很多功能还没有时间做完,希望大家多提意见。 Nightingale QQ:851082415 最近更新内容,点击校验按钮,系统自动识别关键字,数据表名和字段并染色。 解决了输入提醒过程中,背景频闪问题,但是提醒框再重绑定过程中的频闪还是没有解决。 新增Oracle,记录登录信息功能 文件内xml文件不要删除~~正在考虑要程序自动生成XML中。 有意研究的朋友QQ联系我,可以提供源代码~

110,534

社区成员

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

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

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