В течение двух недель каждый день с момента установки Windows 7 я изо всех сил пытался заставить что-то работать. Что-то, что отлично работало в XP. Это сводит меня с ума, отравляет мою жизнь, разрушает мои дни. Почему такая простая задача работает так хаотично!?
Мне кажется, я обнаружил ошибку в Windows 7, в частности, в том, как функция ShowWindow работает в стандартной теме (Aero).
Чтобы продемонстрировать это, я загрузил 2 приложения C # WinForms и их исходный код.
http://www.axonnsd.org/W/P007/BugsDemo.rar
HideableApplication представляет приложение, которое вы можете скрыть в SysTray при его закрытии. Двойной щелчок по значку SysTray открывает его, а при щелчке правой кнопкой мыши появляется опция «Выход».
HideableApplicationRevealer пытается показать окно HideableApplication.
Причина, по которой мне нужно выполнить эту задачу, заключается в том, что я сворачиваю свой Total Commander и FireFox в лоток и хочу вернуть их через HotKey. Total Commander предлагает такую функциональность, но она не работает.
В Windows XP мне удалось без проблем выполнить обе эти задачи, используя прикрепленный код.
В Windows 7 поведение в лучшем случае нестабильно, а в худшем - не работает.
Когда HideableApplication запускается внутри Visual Studio, все работает:
- Попытка раскрыть его с помощью HideableApplicationRevealer из Visual Studio => SUCCESS
- Попытка раскрыть его с помощью ручного запуска HidebleApplicationRevealer.exe из папки Debug => SUCCESS
- Попытка раскрыть это с помощью HideableApplicationRevealer.exe с помощью сочетания клавиш => SUCCESS
- Попытка раскрыть его с помощью запуска HIdeableApplicationRevealer.exe с помощью запланированной задачи с правами администратора => УСПЕХ.
Когда HideableApplication выполнялся вручную (через .exe из папки Debug) и Visual Studio запускается, он работает, если я использую права администратора или запускаю его вручную:
- Попытка раскрыть его с помощью HideableApplicationRevealer из Visual Studio => FAIL
- Попытка раскрыть его с помощью ручного запуска HidebleApplicationRevealer.exe из папки Debug => SUCCESS
- Попытка раскрыть это с помощью HideableApplicationRevealer.exe с помощью сочетания клавиш => FAIL
- Попытка раскрыть его с помощью запуска HIdeableApplicationRevealer.exe с помощью запланированной задачи с правами администратора => УСПЕХ.
- Попытка раскрыть его с помощью запуска HideableApplicationRevealer.exe с помощью сочетания клавиш (меню «Пуск»), которому присвоено значение ADMIN RIGHTS => SUCCESS.
Когда HideableApplication выполнялся вручную (через .exe из папки Debug) И Visual Studio БЫЛ ВЫКЛЮЧЕН: он работает, только если я запускаю его вручную (двойной щелчок exe):
- Попытка раскрыть его с помощью ручного запуска HidebleApplicationRevealer.exe из папки Debug => SUCCESS
- Попытка раскрыть это с помощью HideableApplicationRevealer.exe с помощью сочетания клавиш => FAIL
- Попытка раскрыть его с помощью запуска HIdeableApplicationRevealer.exe с помощью запланированной задачи с правами администратора => ПРОБЛЕМЫ: вместо панели отображается окно на панели задач!
- Попытка раскрыть его с помощью запуска HideableApplicationRevealer.exe с помощью сочетания клавиш (меню «Пуск»), которому присвоено значение ADMIN RIGHTS => SUCCESS.
Если это имеет значение, я воспроизвел это поведение как с панелью задач в ее стандартном положении, так и с установленным AutoHide в левой части экрана.
Очевидно, мне нужны права администратора, чтобы отобразить окно, но даже если это так, оно не работает должным образом, когда я использую обходное решение для запланированной задачи (создайте запланированную задачу с правами администратора и вызовите запланированную задачу через system32 / schtasks.exe / run / tn "имя задачи"). Происходит следующее: ПОСЛЕ ВИЗУАЛЬНОЙ СТУДИИ ВЫКЛЮЧЕНО, на панели задач мигает окно, а не отображается (и не имеет фокуса). Он появляется, но у него нет фокуса клавиатуры, что НЕ должно происходить, потому что я также использовал API SetForegroundWindow.
Это именно то, что происходит, когда я пытаюсь запустить раскрытие Total Commander: читайте ниже, то же поведение: мигает на панели задач вместо того, чтобы отображаться.
И даже не заводите меня на различие в поведении между его запуском из Visual Studio и его запуском из обычной папки C: \ MyProjects.
My TotalCommanderRevealer и FireFoxRevealer демонстрируют даже более странные поведения: при запуске Visual Studio приложение Total Commander перестает работать должным образом. Даже если я загружаю NO PROJECT, вместо того, чтобы показывать TC, он просто мигает на панели задач. Однако, если я открою проект TCRevealer, он снова начнет работать! Если я выключаю Visual Studio, он перестает работать, пока я не перезапущу Windows.
FireFoxRevealer вместо того, чтобы раскрывать FireFox, делает что-то очень странное: в верхнем левом углу экрана отображается небольшая метка, обычно с чем-то связанным с открытой вкладкой. Я подозреваю, что это связано со стилем окна и тем, как работает функция ShowWindow в Windows 7. Однако иногда это работает, показывая реальное окно. Но в большинстве случаев это не так. И когда он перестает работать, я никогда не заставляю его работать снова, пока не произойдут определенные неизвестные обстоятельства, и он снова заработает. Тем не менее, это работало безупречно под Windows XP и теперь вообще не работает.
Если вы хотите воспроизвести проблему FireFox, используйте код, который я прикрепил: вместо поиска текста «Скрываемое приложение» в API FindWindow выполните поиск «MozillaWindowClass», установите FireFox 7 или 8 и установите FireFox «Свернуть в лоток» Оживший "аддон".
Я должен также упомянуть, что мне известен параметр реестра «ForegroundLockTimeout», и я установил его на 0 везде, где он появляется в реестре. В Windows XP по умолчанию установлено значение 0, но в Windows 7 значением по умолчанию было 200000, которое я изменил. Может как-то это где-то задержится ??? И Visual Studio во время работы устанавливает 200000 при выключении, пока я не перезагружу компьютер? Я посмотрел в реестре и он не меняется, он все равно 0. Но кто знает?