窗口拖动事件c#

时间:2015-09-26 04:42:20

标签: c# windows event-handling pinvoke

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

我的目标是在后台运行程序,同时拖动窗口可以将其捕捉到预设位置(显示拖动时的预览窗口和释放时的捕捉)。

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

1 个答案:

答案 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页面。