Проблема с использованием Show Desktop с SetParent в WPF
Я работаю над простой активной заменой рабочего стола для школы, которая мигрирует на Windows 7. Идея состоит в том, чтобы создать окно с несколькими большими кнопками с изображениями, чтобы их могли использовать маленькие дети, у которых проблемы с чтением.
Я использую SetParent(), чтобы установить для родителя моего окна значение "Progman", чтобы оно всегда было сзади и не было свернуто, когда пользователь выбирает "Показать рабочий стол". В Windows XP все работает нормально, но в Windows 7, когда пользователи нажимают "Показать рабочий стол", окно остается, но содержимое заменяется на пользовательский фон Windows. Кнопки все еще работают (вы просто не можете их видеть), и если вы измените размер или обновите окно, они появятся снова. Картина проблемы:
Есть идеи, почему это происходит? Кто-нибудь знает, как я могу принудительно обновить окно при нажатии "Показать рабочий стол"?
1 ответ
Я подозреваю, что в вашем случае ваше приложение выдает исключение, но не вылетает. Приложения WPF имеют тенденцию делать это, если исключение выдается во время ctor некоторого элемента пользовательского интерфейса. Это может нарушить стек рендеринга.
Я пытался воспроизвести проблему, но безуспешно. Из моих тестов я смог получить дескриптор Progman и установить главное окно в качестве родительского при использовании основной темы Windows 7 (без стрелки).
Когда я использовал тему Arrow, вызов SetParent приводил к исчезновению окна. Небольшое исследование обнаружило возможное решение. Вместо установки родителя в качестве окна "Progman", вы можете попробовать использовать дочерний "SysListView32" (дочернее окно, используемое для хранения значков на рабочем столе).
Проблема в том, что получить SysListView32 не так просто. Раньше речь шла о переходе от "Progman" к "SHELLDLL_DefView", а затем к "SysListView32", однако Windows 7 изменила это. SHELLDLL_DefView - теперь дочерний элемент WorkerW... иногда.
Вот лучшая статья, которую я смог найти, объясняя это: http://fernandomachadopirizen.wordpress.com/2010/08/09/give-me-a-handle-and-i-will-move-the-earth/