SetWindowPos / MoveWindow постоянная проблема - PullRequest
1 голос
/ 04 февраля 2011

Я использую SetWindowPos и MoveWindow для изменения размера и центрирования окон. Он работает нормально, но в нескольких окнах, таких как Windows Media Player или Control Panel, когда вы закрываете окно и открываете его снова, новое изменение размера / перемещение не отражается. Когда я изменяю размер вручную, изменения отражаются при следующем открытии окна. Даже если я позвоню UpdateWindow, изменения не отразятся. Что-то, что мне нужно, чтобы отправить окно, чтобы изменения были сохранены? RedrawWindow поможет? Спасибо

1 Ответ

4 голосов
/ 04 февраля 2011

Вы должны использовать функции GetWindowPlacement и SetWindowPlacement вместо того, чтобы извлекать и изменять восстановленные, свернутые,и развернутые позиции окна.Это гарантирует, что размеры окна правильно сохраняются приложением, чтобы их можно было восстановить при следующем запуске.

Поскольку вы используете C #, вам потребуется P / Invoke эти функции из Windows API:

const int SW_HIDE = 0;
const int SW_SHOWNORMAL = 1;
const int SW_SHOWMINIMIZED = 2;
const int SW_SHOWMAXIMIZED = 3;

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool GetWindowPlacement(IntPtr hWnd, out WINDOWPLACEMENT lpwndpl);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool SetWindowPlacement(IntPtr hWnd, [In] ref WINDOWPLACEMENT lpwndpl);

[StructLayout(LayoutKind.Sequential)]
struct RECT
{
    public int left;
    public int top;
    public int right;
    public int bottom;
}

[StructLayout(LayoutKind.Sequential)]
struct WINDOWPLACEMENT
{
    public int length;
    public int flags;
    public int showCmd;
    public Point ptMinPosition;
    public Point ptMaxPosition;
    public RECT rcNormalPosition;
}
...