我正在尝试使用系统托盘应用程序中的C#挂钩每个活动/可见窗口的窗口拖动事件。我有代码来查找和移动使用PInvoke计算出的所有窗口,但我无法弄清楚如何挂钩到拖动事件。
我的目标是在后台运行程序,同时拖动窗口可以将其捕捉到预设位置(显示拖动时的预览窗口和释放时的捕捉)。
我如何挂钩窗口拖动事件?
答案 0 :(得分:-1)
您可以尝试设置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页面。