SetWindowLong не работает на некоторых компьютерах
Изменить: Дополнительная информация Я сузил его до определенных приложений на определенных компьютерах. Я пытаюсь запустить Chrome в полноэкранном режиме на определенном мониторе. Это прекрасно работает на большинстве систем, которые я тестировал, однако мы столкнулись с набором компьютеров под управлением Windows 7 Pro 32bit, которые перемещаются и изменяют размеры правильно, но их границы и кнопки остаются нетронутыми.
Я понимаю, что все окна Chrome порождаются в рамках одного процесса Chrome и что их жизненный цикл является изменчивым, но мы смогли обойти это, используя отдельный каталог данных, в котором каждый экземпляр Chrome запускается таким образом в своем собственном родительском процессе. Похоже, что Chrome - единственное приложение, у нас проблемы с запуском полноэкранного режима только на одном компьютере. Например, при запуске calc.exe он максимизирует и удаляет границы без проблем во всех протестированных нами системах. Я подтвердил, что версия Chrome, работающая на каждой системе, одинакова. Я был бы очень признателен, если бы у кого-то было больше понимания ни этой проблемы, ни способов дальнейшего устранения проблемы.
Я пытаюсь запустить приложение в полноэкранном режиме, используя SetWindowLong, и оно прекрасно работало до последнего компьютера, на котором я его пробовал. Я в основном использую код, указанный в этом вопросе: Удаление границы окна?
Это отлично работает как на моих ноутбуках (Windows 7 Ultimate), так и на нескольких рабочих боксах, на которых я его тестировал (Windows 7 POS Embedded), но не работает на другом компьютере на работе (Windows 7 Professional). Вызов SetWindowLong возвращает ожидаемое значение, которое указывает мне, что оно должно работать, и вызов SetWindowPos работает нормально, так как корректно изменяет размер окна, но граница и кнопки все еще там! Он функционирует так, как будто не было никакого вызова SetWindowLong вообще. Я был бы очень признателен за некоторую помощь, поскольку у меня нет идей на данный момент.
Изменить: Вот код во всей красе с красными глазами 1:00. Практически прямая копия связанного вопроса.
int lStyle = GetWindowLong(process.MainWindowHandle, GWL_STYLE);
lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU);
_logger.Debug(String.Format("Style: {0}", lStyle)); // 369295360
var swlResult = SetWindowLong(process.MainWindowHandle, GWL_STYLE, lStyle);
_logger.Debug(String.Format("SetWindowLong: {0}", swlResult)); // 382664704
int lExStyle = GetWindowLong(process.MainWindowHandle, GWL_EXSTYLE);
lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
SetWindowLong(process.MainWindowHandle, GWL_EXSTYLE, lExStyle);
Screen screen = GetDisplay(display);
return SetWindowPos(
process.MainWindowHandle,
HWND_TOPMOST,
screen.WorkingArea.Left,
screen.WorkingArea.Top,
screen.WorkingArea.Width,
screen.WorkingArea.Height,
SetWindowPosFlags.SWP_FRAMECHANGED);
2 ответа
Нашел проблему. Мы используем LogMeIn для удаленного управления компьютером, и кажется, что их драйвер видео зеркала вызывает проблемы на некоторых машинах. Удаление их зеркального драйвера и перезапуск заставляют все работать как положено.
Также случается, что это терпит неудачу с устаревшими копиями XP (даже SP3, и, возможно, другие). На более чем дюжине рабочих станций я подтвердил, что установка рекомендуемых обновлений решает эту проблему. Для каждого было в среднем достаточно обновлений, поэтому трудно сказать, какой из них выполнил свою задачу, но, очевидно, один из них сделал. Еще одна причина держать обновления включенными.
Является ли система Windows 7 Professional 64-разрядной? Согласно документации для SetWindowLong
Эта функция была заменена функцией SetWindowLongPtr. Чтобы написать код, совместимый как с 32-разрядной, так и с 64-разрядной версиями Windows, используйте функцию SetWindowLongPtr.
Попробуйте изменить код для вызова функции SetWindowLongPtr в 64-битных системах и посмотрите, что произойдет.