2016-06-07 2 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

@ Джонатан Поттер Возвращаемое значение равно нулю, т. Е. Успешная операция –

+0

См. Ответ на http://stackoverflow.com/questions/6160118/disable-aero-peek-in-wpf-application, похоже, что вы передаете указатель данных некорректно. –

ответ

-1

Не самый лучший вариант, но вы можете попробовать позвонить SystemParametersInfo() указав 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 как «использование глобальной настройки для устранения локальной проблемы» и обычно [нахмурился] (https://blogs.msdn.microsoft.com/oldnewthing/20081211-00/?p= 19873) –

+0

Странная вещь, даже когда я использую это глобальное решение, анимация все еще показывает :( –

+0

@Damien_The_Unbeliever: предоставляется, но я не знаю другого способа отключить анимацию окна локально. –

Смежные вопросы