c# - 如何挂钩事件或 WPF 应用程序中窗口的更改?
问题描述
大家,希望你们一切都好。这是要求:我有一个 C# WPF 应用程序,我想跟踪这个应用程序中的事件。
不是母语,见谅。谢谢你。
我在“ https://github.com/justcoding121/Windows-User-Action-Hook ”上找到了一个鼠标挂钩,但它可以挂钩全局事件而不是应用程序中的事件。
此挂钩无法挂钩 WPF 应用程序中的事件。
解决方案
在我们得到答案之前,您需要注意两件事:
1)在 WPF 中,除了窗口本身之外的所有东西都是人工的——所有 UI 元素都是通过 DirectX 而不是操作系统绘制的(这就是为什么,例如,在 WPF 中,您可以将一个按钮放入另一个按钮,但在 Windows 窗体中,您可以't)。因此,操作系统无法以某种方式了解应用程序中的鼠标事件。
2) WPF 中的几乎所有事件都是路由的——这意味着,当一个控件触发一个事件时,它实际上可以在多个位置进行处理,通常是首先在该控件上,然后向上到树并包括窗口。控件向上(或向下)树将触发此事件,即使它没有在它们上声明(如 Click 未在窗口上声明,但窗口仍可以间接响应自身内部的点击)。
顺便说一句,您可以正常使用事件(例如,this.MouseMove += MyHandler; 在窗口构造函数中或 <Window MouseDown="DownHandler" ...> 在 XAML 中)或通过路由事件语法(this .AddHandler(Button.ClickEvent, MyHandler); 在 C# 中或 <Window Button.Click="ClickHandler" ...> 在 XAML 中)。后者通常仅在您处理未在元素上声明的事件时才需要(例如单击窗口)。
推荐阅读
- javascript - Axios 请求将 URL 变量添加到 localhost URL
- android - 为什么工具栏消失了?
- ios - 无法根据时间戳在聊天应用程序中检索文档
- android - iBeacon UUID 未正确显示 Kotlin
- php - 使用现有的 Idp 和 SP 在 Laravel 中集成 SAML
- php - 如何在 laravel 6 的会话中保存每个 foreach 数据?
- java - 未找到 Zip 标头,可能不是 zip 文件 - Zip4j、java
- javascript - Href to another page React Gatsby
- angularjs - akka-http 网络::err_incomplete_chunked_encoding 200 (ok)
- apache-spark - 如何附加两个字典RDD并形成一个字典rdd以发送到pyspark中的kafka主题?