如何使我的 C# 程序在每次当前活动窗口更改时执行某些操作
本文关键字:窗口 执行 操作 活动 我的 何使 程序 | 更新日期: 2023-09-27 18:31:32
我有一些代码可以截取活动窗口的屏幕截图。我的老板希望每次活动窗口更改时我都必须运行的代码。例:
- 打开计算器 - 截图已截 图
- 将焦点切换到记事本 - 截取屏幕截图
- 将焦点切换到 Chrome - 截图已截图
我想到的第一个想法是将当前活动窗口句柄的句柄存储在变量中,然后不断检查当前活动窗口的句柄是否与变量中的值相同。有没有办法订阅我计算机中发生的事件,并在活动窗口更改时告诉我?
请查看 Win32 API 中可用的以下方法,
SetWinEventHook()
UnhookWinEvent()
这将帮助您检测窗口更改事件。
示例代码
using System;
using System.Windows;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class NameChangeTracker
{
delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType,
IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);
[DllImport("user32.dll")]
static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr
hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess,
uint idThread, uint dwFlags);
[DllImport("user32.dll")]
static extern bool UnhookWinEvent(IntPtr hWinEventHook);
const uint EVENT_OBJECT_NAMECHANGE = 0x800C;
const uint WINEVENT_OUTOFCONTEXT = 0;
// Need to ensure delegate is not collected while we're using it,
// storing it in a class field is simplest way to do this.
static WinEventDelegate procDelegate = new WinEventDelegate(WinEventProc);
public static void Main()
{
// Listen for name change changes across all processes/threads on current desktop...
IntPtr hhook = SetWinEventHook(EVENT_OBJECT_NAMECHANGE, EVENT_OBJECT_NAMECHANGE, IntPtr.Zero,
procDelegate, 0, 0, WINEVENT_OUTOFCONTEXT);
// MessageBox provides the necessary mesage loop that SetWinEventHook requires.
// In real-world code, use a regular message loop (GetMessage/TranslateMessage/
// DispatchMessage etc or equivalent.)
MessageBox.Show("Tracking name changes on HWNDs, close message box to exit.");
UnhookWinEvent(hhook);
}
static void WinEventProc(IntPtr hWinEventHook, uint eventType,
IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
// filter out non-HWND namechanges... (eg. items within a listbox)
if(idObject != 0 || idChild != 0)
{
return;
}
Console.WriteLine("Text of hwnd changed {0:x8}", hwnd.ToInt32());
}
}