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

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

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

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

...全文
331 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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好些吧

111,094

社区成员

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

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

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