«Подготовка рабочего стола» мешает графическому интерфейсу Windows 7?

У меня есть программа .NET (ориентированная на профиль клиента 3.5), которая создает новую учетную запись администратора, перезагружается, а затем автоматически входит в систему под этой учетной записью, используя значение реестра AutoAdminLogon. Перед перезагрузкой он устанавливает RunOnce для повторного запуска при запуске. После перезагрузки компьютера и входа в систему программа должна скрыть стартовую сферу и панель задач и перейти в полноэкранный режим.

Проблема в том, что при перезагрузке появляется сообщение «Подготовка рабочего стола» , предположительно для вновь созданной учетной записи администратора. Моя программа продолжает работать в фоновом режиме, но по завершении экрана «Подготовка рабочего стола» панель задач и начальная сфера не скрываются. Почему это могло быть? При каждом последующем перезапуске панель задач и начальная сфера скрываются правильно, но затем экран «Подготовка рабочего стола» больше не появляется.

Я использую этот метод, чтобы скрыть панель задач и начало Сфера:

  IntPtr hwnd = FindWindow ("Shell_TrayWnd", ""); ShowWindow (hwnd, SW_HIDE); IntPtr orb = FindWindowEx (IntPtr.Zero, IntPtr.Zero, (  IntPtr) 0xC017, null); ShowWindow (orb, SW_HIDE);  

Методы FindWindow, ShowWindow и FindWindowEx находятся в win32.dll.

Итак, я предполагаю, что мой последний вопрос: экран «Подготовка рабочего стола» каким-либо образом блокирует отображение или скрытие элементов пользовательского интерфейса Windows? Если, например, пользовательский интерфейс даже не был создан для отображения или скрытия, как я могу дождаться завершения экрана загрузки и затем запустить мою программу?


1

Мои психические навыки отладки говорят мне, что FindWindow не работает, потому что в пункте «Подготовка рабочего стола» не найден Shell_TrayWnd . Это приведет к сбою первого ShowWindow, равно как и FindWindowEx и последующих ShowWindow для этого дескриптора.

Вы должны всегда проверять возвращаемые значения всех вызовов API, прежде чем просто предположить, что они работают, и слепо продолжать выполнение вашего кода. Например, в документации для FindWindow сказано, что в случае сбоя возвращаемое значение будет NULL :

Возвращаемое значение

Тип:

Тип: HWND

Если функция завершается успешно, возвращаемое значение — дескриптор окна, которое имеет указанное имя класса и имя окна.

Если функция не работает, возвращаемое значение — NULL. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Поделиться
Улучшите этот ответ
ответил 03 июля ’14 в 15:09
  • Понятно, поэтому в реальном коде есть проверка на ошибки. А также, почему есть второй вопрос, который я задал по поводу вашей точки зрения о «Shell_TrayWnd», который еще не существует. Я бы просто поместил код в цикл while, проверяющий значение null, но я не уверен, как это повлияет на процесс запуска Windows. — CP1099 03 июл. 2014 в 15:13
добавить комментарий |

Мои навыки экстрасенсорной отладки говорят мне, что FindWindow не работает, потому что в пункте «Подготовка рабочего стола» нет Shell_TrayWnd не найдено. Это приведет к сбою первого ShowWindow, равно как и FindWindowEx и последующих ShowWindow для этого дескриптора.

Вы должны всегда проверять возвращаемые значения всех вызовов API, прежде чем просто предположить, что они работают, и слепо продолжать выполнение вашего кода. Например, в документации для FindWindow сказано, что в случае сбоя возвращаемое значение будет NULL :

Возвращаемое значение

Тип:

Тип: HWND

Если функция завершается успешно, возвращаемое значение — дескриптор окна, которое имеет указанное имя класса и имя окна.

Если функция не работает, возвращаемое значение — NULL. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Оцените статью
Botgadget.ru
Добавить комментарий