2012-01-06 59 views
6

如果窗口是例如Firefox,将其标题从Firefox更改为Stack Overflow - Firefox,然后我希望我的应用程序记录Firefox更改其标题。窗口标题已更改事件

这可能没有使用钩子和循环(EnumWindows)?如果只能用钩子完成,哪种类型的钩子?

+0

您是否在谈论单个浏览器以及重定向..?你有没有在Request/Response和头文件中搜索?只是好奇,如果我在同一页上,你是.. – MethodMan 2012-01-06 20:54:06

+1

是的,需要挂钩。很确定我已经告诉过你关于WH_SHELL。 – 2012-01-06 21:01:35

+1

可能重复的[记录在Windows中关闭所有Windows](http://stackoverflow.com/questions/8648386/log-all-windows-that-are-closed-in-windows) – 2012-01-06 21:02:12

回答

9

WinEvents是去这里的路。您需要的API是SetWinEventHook() - 如果您关心特定窗口,请使用GetWindowThreadProcessId()获取HWND的threadId,然后仅侦听来自该特定线程的事件。对于窗口标题更改,您需要EVENT_OBJECT_NAMECHANGE事件。

你可以勾住“在上下文中”或“在上下文之外” - 后者是最简单的,并且意味着事件被传递回自己的进程,所以你不需要单独的DLL - 这使得它可能在C#中做到这一切;但调用SetWinEventHook的线程必须有一个消息循环(GetMessage/TranslateMessage/DispatchMessage),因为事件是在幕后使用消息形式传递的。

在您的WinEvent回调中,您需要检查HWND是否是您关心的人,因为您将获得该目标线程上任何UI的名称更改,可能包括子窗口名称更改或其他事情你不在乎。

-

顺便说一句,你可以检查this answer为使用的WinEvents一些C#示例代码;它使用它们来跟踪桌面上所有窗口的前景窗口变化;但是应该只是进行一些简单的修改,以便跟踪特定窗口上的名称更改。

+1

EVENT_OBJECT_NAMECHANGE发生了很多事情,即使将鼠标移动到同一个窗口的同一个选项卡上,也会触发EVENT_OBJECT_NAMECHANGE!它与你所说的“可能包括子窗口名称变化”有关,但是如何避免这种情况?只是忽略回调中同样的经常性“窗口标题”? – JohnTube 2014-02-25 16:09:42

+1

如果您只对一个进程中的更改感兴趣,则可以在“SetWindowEventHook”调用中指定进程的ID,这将大大减少所观察事件的数量。 – 2016-06-21 14:20:46

+0

@BrendanMcK我在切换窗口时得到了标题,例如。从chome> notepad> visualstudio,但没有得到如何实现在visualstudio中更改选项卡或文档更改的事件。你能帮忙吗?问候 – 2016-10-27 11:06:02

3

您将需要一个钩子(或您在问题中提到的轮询技巧)。

基本上在Windows API中,要更改“窗口标题” - 或者更确切地说窗口文本 - 您发送WM_SETTEXT,所以您的挂钩需要截取该消息。您需要的钩子类型为WH_CALLWNDPROC,只需检查您收到的邮件是否为WM_SETTEXT,而hWnd是您正在查看的应用程序的主窗口(因此您不会像应用程序尝试设置儿童窗户的文字)。

这里小记:虽然这可能不是这种情况,但请注意,您看到的标题实际上只能手动绘制,而不是通过常规的Windows API进行绘制。使用Spy ++或其他东西来看看发生了什么事情之前,沿着这条路线走得太远,你可能会花费大量的时间。

+1

这会工作,但不是最简单的方法。 WH_CALLWNDPROC挂钩的问题是你需要一个单独的C/C++ DLL--你不能在C#中完成所有的工作。 (另外,如果你关心的话,你需要单独的32位和64位代码钩子。)SetWinEventHook在这里可能会更适合,因为你可以将通知传递回你自己的进程,避免需要单独的DLL。 – BrendanMcK 2012-01-11 07:18:36

+0

你已经发布了你的答案,为什么要打扰这个评论? – Blindy 2012-01-11 13:13:08

+5

因此,一个潜在的未来SO读者会理解这两种技术如何相互关联,或者即使只能扫描接受的答案也会看到这个警告;评论比单独的答案具有更好的空间局部性。 – BrendanMcK 2012-01-11 14:12:02

-7

你不需要任何钩子。只需使用Windows事件

+3

.......比如? – LarsTech 2012-01-08 14:08:04

+0

@fred,这不是一个非常有用的答案:Windows有很多可用的功能,可以描述为事件。如果你是谷歌的“寡妇事件”,你会得到一个Windows事件日志记录的第一场比赛,这是一个完全不相关的技术。至少提供一个API名称或类似名称(最好带有链接),以便读者能理解你在说什么。 – BrendanMcK 2012-01-11 07:13:49