2017-02-16 9 views
-1

無効なサイズ変更機能(WindowStyle = None、ResizeMode = CanMinimize)を使用したWPFウィンドウがあります。ShowWindow関数呼び出しに対するウィンドウの反応を無効にします。

1つの状況を除いて、正常に動作します。 SW_MAXIMIZEオプションを使用してウィンドウ上にWIN API関数ShowWindowを呼び出すアプリケーション(つまりAutoHotKey)があれば、サイズ変更を行わずにデスクトップ上でウィンドウの位置を(0、0)に戻し、ユーザーは画面上をさらに移動することができません。

この動作を無効にするにはどうすればよいですか?窓がこの窓を無視するようにしたい。

私はWM_WINDOWPOSCHANGINGイベントに反応しようとしましたが、これはユーザーがウィンドウを最小化するまで動作します。最小化されて復元された後、再び(0、0)座標に再配置されます。

private IntPtr ProcessMessage(IntPtr windowHandle, int msg, IntPtr wideParam, IntPtr leftParam, ref bool handled) 
{ 
    Msg windowsMessage = (Msg)msg; 
    switch (windowsMessage) 
    { 
     case Msg.WM_WINDOWPOSCHANGING: 
      { 
       WindowPos windowPos = (WindowPos)Marshal.PtrToStructure(leftParam, typeof(WindowPos)); 

       if (IsNoClientAction(windowPos) && !IsMinimizing(windowPos) && window.WindowState == WindowState.Normal) 
       { 
        windowPos.Flags = SetWindowPosFlags.SWP_NOSIZE | SetWindowPosFlags.SWP_NOMOVE; 
        handled = true; 
        Marshal.StructureToPtr(windowPos, leftParam, true); 
       } 

       break; 
      } 
    } 

    return IntPtr.Zero; 
} 

private static bool IsNoClientAction(WindowPos windowPos) 
{ 
    return (windowPos.Flags & SetWindowPosFlags.SWP_NOCLIENTSIZE) != 0 || (windowPos.Flags & SetWindowPosFlags.SWP_NOCLIENTMOVE) != 0; 
} 

private static bool IsMinimizing(WindowPos windowPos) 
{ 
    return windowPos.Left == -32000 && windowPos.Top == -32000; 
} 

答えて

0

私はウィンドウに何を行うのかを分析し、それに基づいて解決策を見つけました。 Wndprocにメッセージを送信する前に、ウィンドウのGWL_STYLEフラグを更新して、WS_MAXIMIZEを有効にします。このため、ウィンドウの状態が破損し、ウィンドウメッセージのみを処理することで、さらに動作を処理することはほとんどできません。

private IntPtr ProcessMessage(IntPtr windowHandle, int msg, IntPtr wideParam, IntPtr leftParam, ref bool handled) 
{ 
    Msg windowsMessage = (Msg)msg; 
    switch (windowsMessage) 
    { 
     case Msg.WM_WINDOWPOSCHANGING: 
      { 
       WindowPos windowPos = (WindowPos)Marshal.PtrToStructure(leftParam, typeof(WindowPos)); 

       if (IsNoClientAction(windowPos)) 
       { 
        WindowStyles styles = (WindowStyles)WindowsAPI.GetWindowLongPtr(windowHandle, GWL.GWL_STYLE); 
        if ((styles & WindowStyles.WS_MAXIMIZE) != 0) 
        { 
         windowPos.Flags |= SetWindowPosFlags.SWP_NOSIZE | SetWindowPosFlags.SWP_NOMOVE; 
         WindowsAPI.SetWindowLongPtr(new HandleRef(this, windowHandle), GWL.GWL_STYLE, (IntPtr)(long)(styles^WindowStyles.WS_MAXIMIZE)); 
         handled = true; 
         Marshal.StructureToPtr(windowPos, leftParam, true); 
        } 
       } 

       break; 
      } 
    } 

    return IntPtr.Zero; 
} 

private static bool IsNoClientAction(WindowPos windowPos) 
{ 
    return (windowPos.Flags & SetWindowPosFlags.SWP_NOCLIENTSIZE) != 0 || (windowPos.Flags & SetWindowPosFlags.SWP_NOCLIENTMOVE) != 0; 
} 
WM_WINDOWPOSCHANGINGが処理されるとき、私は戻って、このフラグを設定しています SW_MAXIMIZEオプションで ShowWindow上のウィンドウの反応を無効にするには

関連する問題