如何将EVENT_SYSTEM_MOVESIZESTART与WinEventProc一起用作全局窗口位置更改/调整大小事件?

时间:2017-04-06 13:45:33

标签: c# windows winapi events

我正试图赶上移动并在全球范围内调整事件大小。 我找到了通过Win32 API WinEventProc使用EVENT_SYSTEM_MOVESIZESTART事件的方法(实际上我正在使用C#P / invoke)。 但我找不到有关它的详细信息。我有一些问题:

  • Q1。有没有办法在引发EVENT_SYSTEM_MOVESIZESTART事件时区分 MOVE或RESIZE,而不轮询窗口大小/位置。

    public static void __WinEventDelegate(IntPtr hWinEventHook, Native.EVENT eventType, IntPtr hWnd, Native.OBJID idObject, Native.CHILDID idChild, uint dwEventThread, uint dwmsEventTime)
    {
        if (eventType == Native.Event.SYSTEM_MOVESIZESTART)
        {
            switch (__something__)
            {
                case __THIS_EVENT_IS_MOVE:
                    doSomethingWhenMoveStarted();
                    break;
                case __THIS_EVENT_IS_RESIZE:
                    doSomethingWhenResizeStarted();
                    break;
    

    (恕我直言,Windows并没有在内部区分它们??)

  • Q2。是否有像EVENT_SYSTEM_MOVINGRESIZING这样的事件或方式,如mousemove event on javascript/DOM一样不断提高?

如果你有另一种方法可以做Q1,Q2,请告诉我! 感谢。

1 个答案:

答案 0 :(得分:0)

您指定的事件EVENT_SYSTEM_MOVESIZESTART由系统发送。

我怀疑此事件是否被DefWindowProc识别。

但在这种情况下,我猜窗口会收到WM_ENTERSIZEMOVE

然后你可以处理被覆盖的窗口过程函数的case语句。

wParam指定SC_MOVESC_SIZE值,以确定其是移动还是调整大小

以下是伪代码:

LRESULT CALLBACK WndProc(HWND hWNd, UINT message, WPARAM wParam, LPARAM lParam)
{

   switch (message)
   {
   case WM_ENTERSIZEMOVE:

    if(wParam == SC_MOVE)
        {
        //MOVE
        }
        else
        {
        //RESIZE
        }     

   default:
    //Call to default winproc
   }

}

正如您所说的C#WM_ENTERSIZEMOVE中有WM_EXITSIZEMOVESystem.Windows.Forms相关联的事件。它们是ResizeBeginResizeEnd。但我不确定这些事件是否可以处理Move