2016-06-07 7 views
2

HWnd ShowWindow() 메서드를 호출 할 때 애니메이션을 숨기는 방법을 알고 싶습니다. 여기 내 코드입니다 :HWND API : ShowWindow (...) 호출시 창 애니메이션을 해제하는 방법

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow); 

public enum ShowWindowCommands 
{ 
    HIDE = 0, 
    SHOWNORMAL = 1, 
    SHOWMINIMIZED = 2, 
    MAXIMIZE = 3, 
    SHOWNOACTIVATE = 4, 
    SHOW = 5, 
    MINIMIZE = 6, 
    SHOWMINNOACTIVE = 7, 
    SHOWNA = 8, 
    RESTORE = 9, 
    SHOWDEFAULT = 10, 
    FORCEMINIMIZE = 11 
} 

public static void MinimizeWindow(IntPtr hWnd) 
{ 
    ShowWindow(hWnd, ShowWindowCommands.MINIMIZE); 
} 

문제는, 애니메이션이 실행하고, 애니메이션이 완료 될 때까지 방법은 반환하지 않습니다.

은 내가 DwmSetWindowAttribute() 방법을 사용하여 시도 :

[DllImport("dwmapi.dll", PreserveSig = true)] 
static extern int DwmSetWindowAttribute(IntPtr hWnd, uint attr, ref int attrValue, int size); 

const uint DWM_TransitionsForceDisabled = 3; 

public static void SetEnabled(IntPtr hWnd, bool enabled) 
{ 
    int attrVal = enabled ? 0 : 1; 
    DwmSetWindowAttribute(hWnd, DWM_TransitionsForceDisabled, ref attrVal, 4); 
} 

를하지만 애니메이션은 억제되지 않았다. 내 운영 체제는 Windows 7, 32 비트입니다.

+0

'DwmSetWindowAttribute'의 반환 값을 확인하여 실패했는지 확인하십시오. –

+0

@Jonathan Potter 반환 값은 0입니다. 즉, 작업 성공 –

+0

http://stackoverflow.com/questions/6160118/disable-aero-peek-in-wpf-application에 대한 답변을 보면, 데이터 포인터가 잘못되었습니다. –

답변

-1

최상의 옵션은 아니지만 SPI_GETANIMATION을 지정하여 을 지정하면 창이 애니메이션을 표시하기 전에 SPI_SETANIMATION을 사용 중지 한 다음 이전 설정을 복원 할 수 있습니다. 예를 들면 다음과 같습니다.

[StructLayout(LayoutKind.Sequential)] 
public struct ANIMATIONINFO 
{ 
    uint cbSize; 
    int iMinAnimate; 
} 

[DllImport("User32.dll", SetLastError=true)] 
static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref ANIMATIONINFO pvParam, uint fWinIni); 

const uint SPI_GETANIMATION = 72; 
const uint SPI_SETANIMATION = 73; 

public static void MinimizeWindow(IntPtr hWnd) 
{ 
    ANIMATIONINFO anim; 
    anim.cbSize = Marshal.SizeOf(anim); 
    anim.iMinAnimate = 0; 
    SystemParametersInfo(SPI_GETANIMATION, 0, anim, 0); 

    if (anim.iMinAnimate != 0) 
    { 
     anim.iMinAnimate = 0; 
     SystemParametersInfo(SPI_SETANIMATION, 0, anim, 0); 

     ShowWindow(hWnd, ShowWindowCommands.MINIMIZE); 

     anim.iMinAnimate = 1; 
     SystemParametersInfo(SPI_SETANIMATION, 0, anim, 0); 
    } 
    else 
     ShowWindow(hWnd, ShowWindowCommands.MINIMIZE); 
} 
+2

Old New Thing 블로그에서는 일반적으로 "지역 문제를 해결하기위한 글로벌 설정"과 일반적으로 [frowned upon]로 언급됩니다 (https://blogs.msdn.microsoft.com/oldnewthing/20081211-00/?p= 19873) –

+0

이상하게도이 글로벌 솔루션을 사용하더라도 애니메이션은 여전히 ​​표시됩니다. ( –

+0

@Damien_The_Unbeliever : 부여되었지만 로컬로 창 애니메이션을 끄는 다른 방법을 모른다. –

관련 문제