窗口拖动事件c#
本文关键字:事件 拖动 窗口 | 更新日期: 2023-09-27 18:14:33
我试图在系统托盘应用程序中使用c#钩入每个活动/可见窗口的窗口拖动事件。我有代码来查找和移动使用PInvoke计算出的所有窗口,但我无法弄清楚如何钩入拖动事件。
我的目标是在后台运行程序,在拖动窗口时能够将其捕获到预设位置(在拖动发生时显示预览窗口,并在释放时捕获)。
我如何钩到窗口拖动事件?
您可以尝试设置CBT钩子并处理当窗口即将移动或调整大小时的情况,尽管该钩子监视的不仅仅是这种情况:
class YourClassName
{
const int WH_CBT = 5;
private delegate IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam);
private IntPtr hHook;
private HookCallback hookCallback = new HookCallback(Callback);
[DllImport("user32")]
private static extern IntPtr SetWindowsHookEx(int idHook, HookCallback lpfn, IntPtr hMod, int dwThreadId);
[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32")]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32")]
private static extern IntPtr GetModuleHandle(string lpModuleName);
public void SetHook()
{
using (Process p = Process.GetCurrentProcess()
{
using (var mainMod = p.MainModule)
{
hHook = SetWindowsHookEx(WH_CBT, hookCallback, GetModuleHandle(mainMod.ModuleName, 0);
}
}
}
public bool Unhook()
{
return UnhookWindowsHookEx(hHook);
}
public IntPtr Callback(int nCode, IntPtr wParam, IntPtr lParam
{
if (nCode < 0)
return CallNextHookEx(hHook, nCode, wParam, lParam);
switch (nCode)
{
case 0:
// Handle window move/size here
// wParam is the handle of the window being moved or sized
// other cases...
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
}
不要忘记在终止前调用Unhook()
以释放系统资源。有关SetWindowsHookEx的更多信息,请参阅msdn页面。