Проблема с использованием Show Desktop с SetParent в WPF - PullRequest
0 голосов
/ 25 сентября 2011

Я работаю над простой активной заменой рабочего стола для школы, которая переходит на Windows 7. Идея состоит в том, чтобы создать окно с несколькими большими кнопками с изображениями, чтобы их могли использовать маленькие дети, у которых проблемы с чтением.

Я использую SetParent (), чтобы установить для родителя моего окна значение «Progman», чтобы оно всегда было сзади и не было свернуто, когда пользователь выбирает «Показать рабочий стол». В Windows XP все работает нормально, но в Windows 7, когда пользователи нажимают «Показать рабочий стол», окно остается, но содержимое заменяется на пользовательский фон Windows. Кнопки все еще работают (вы просто не можете их видеть), и если вы измените размер или обновите окно, они появятся снова. Изображение проблемы:
https://files.me.com/adt100/ggi99t

Есть идеи, почему это происходит? Кто-нибудь знает, как заставить принудительно обновить окно при нажатии «Показать рабочий стол»?

1 Ответ

2 голосов
/ 25 сентября 2011

Я подозреваю, что в вашем случае ваше приложение выдает исключение, но не вылетает. Приложения 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/

...