窗口拖动事件c#

本文关键字:事件 拖动 窗口 | 更新日期: 2023-09-27 18:14:33

我试图在系统托盘应用程序中使用c#钩入每个活动/可见窗口的窗口拖动事件。我有代码来查找和移动使用PInvoke计算出的所有窗口,但我无法弄清楚如何钩入拖动事件。

我的目标是在后台运行程序,在拖动窗口时能够将其捕获到预设位置(在拖动发生时显示预览窗口,并在释放时捕获)。

我如何钩到窗口拖动事件?

窗口拖动事件c#

您可以尝试设置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页面。