C# 监听其他程序的窗口移动
时间: 2023-08-10 09:07:48 浏览: 387
要在C#中监听其他程序的窗口移动,你可以使用Windows API中的SetWindowsHookEx函数来安装一个钩子来捕获窗口移动的事件。以下是一个示例代码:
```csharp
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
class Program
{
// 定义钩子委托
private delegate IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam);
// 定义钩子类型常量
private const int WH_CALLWNDPROC = 4;
// 定义Windows API函数
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
// 定义钩子回调方法
private static IntPtr HookCallback(int code, IntPtr wParam, IntPtr lParam)
{
// 检查钩子事件类型
if (code >= 0 && wParam == (IntPtr)0x0213) // WM_MOVING
{
// 获取窗口移动的信息
var movingRect = (RECT)Marshal.PtrToStructure(lParam, typeof(RECT));
// 输出窗口移动的信息
Console.WriteLine($"Window moved: Left={movingRect.left}, Top={movingRect.top}, Right={movingRect.right}, Bottom={movingRect.bottom}");
}
// 调用下一个钩子
return CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
}
// 定义窗口坐标结构体
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
static void Main()
{
// 获取当前进程ID
int currentProcessId = Process.GetCurrentProcess().Id;
// 安装钩子
IntPtr hookHandle = SetWindowsHookEx(WH_CALLWNDPROC, HookCallback, IntPtr.Zero, (uint)currentProcessId);
// 等待退出程序
Console.WriteLine("按任意键退出程序...");
Console.ReadKey();
// 卸载钩子
UnhookWindowsHookEx(hookHandle);
}
}
```
上述代码通过使用 SetWindowsHookEx 函数安装一个钩子来捕获窗口移动的事件。在钩子回调方法 HookCallback 中,我们检查钩子事件类型是否为窗口移动事件(WM_MOVING),然后获取窗口移动的信息并输出到控制台。
请注意,此代码需要以管理员权限运行,否则无法成功安装钩子。另外,钩子会监视整个系统中的窗口移动事件,包括其他程序的窗口移动。你可以根据自己的需求对代码进行修改和扩展。
阅读全文