2011-02-04 4 views
1

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

+0

Проблемы в том, что этот API, явно задать размер окна (и я не уверен, целевое приложение даже получает событие, но я могу ошибаться), поэтому внутренне размеры окна не будут «запоминаться» приложением, когда окно не минимизировано. Я точно не знаю, как это решить, но я бы посмотрел на нечто вроде API SendMessage. – Rob

+0

Забавно думать, что когда я изменяю размер программно, и я вручную наводил на край окна, пока не получаю курсор мыши с изменением размера, тогда я просто нажимаю вниз и вверх (вместо щелчка и перетаскивания), а затем закрываю окно, новый размер который был установлен программно, сохраняется. Как-то мне нужно отправить в окно какое-то сообщение, то же самое, которое отправляется при изменении размера вручную. – user577240

+0

Вы пробовали Spy ++, чтобы узнать, какое событие уволили, когда вы это сделаете? – Marco

ответ

4

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

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

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; 
} 
+0

Ваш вклад очень ценится, я постараюсь это завтра и обновит вас по результатам. Огромное спасибо. – user577240

+0

@ пользователь577240: Конечно, проблем нет. Я понимаю, что это довольно уродливый беспорядок кода, но проблема в том, что в окне должно храниться информация о разных размерах для каждого возможного размещения (сведено к минимуму, нормальное и максимизированное). Это должно делать то, что вы хотите. Дайте мне знать, если вам нужна помощь, вызвав ее с C#. –

+0

К сожалению, это не сработало. Я использую следующее: – user577240