Как запретить [STAThread] блокировать изменение SetThreadDesktop () - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть EXE, который я хочу вызвать из службы.Этот EXE-файл был разработан на C #, но с помощью COM-взаимодействия он вызывает разработанные нами библиотеки DLL.Некоторые из этих DLL используют кучу рабочего стола, потому что у них есть окна / меню / и т. Д., Которые созданы, но никогда не видны.Поверьте мне, это слишком много, чтобы предотвратить это.

Мы разработали ATL-серверы до того, как их вызвали из службы.Для службы ATL мы можем создать новый рабочий стол с большей кучей, используя вызовы CreateDesktopEx().После создания рабочего стола мы можем вызвать SetThreadDesktop(), чтобы изменить рабочий стол.Файлы ATL EXE работают годами.

Теперь появился другой C # EXE.Мы хотим быть в состоянии сделать то же самое с кучей рабочего стола.Я написал функции PInvoke и убедился, что они работают, чтобы иметь возможность создавать рабочие столы и устанавливать их - до тех пор, пока поток не является STA.

Теперь все, что мне нужно для вызова, должно выполняться в SingleРезьбовая квартира (STA).Итак, для функции Main () в EXE я добавляю атрибут [STAThread].В течение года все работало нормально, но теперь мы хотим иметь возможность изменить кучу рабочего стола / рабочего стола.

В моем STAThread я могу успешно создать рабочий стол, используя CreateDesktopEx(), но когда я пытаюсь установитьрабочий стол использует SetThreadDesktop(), затем происходит сбой с кодом ошибки Win32 170, который задокументирован в документации SetThreadDesktop().

Если в потоке были созданы какие-либо хуки или окна, рабочий стол изменить нельзя.Я предполагаю , что эффект атрибута STAThread заключается в вызове CoInitialize/Ex() под колпаком, и что CoInitialize/Ex() создает невидимое окно для обработки входящих вызовов или устанавливает какой-то тип перехвата.

Я уже пытался создать новый поток с именем Thread.SetApartmentState() со значением STA и запустить поток, но я все еще не могу изменить кучу рабочего стола / десктопа.

Я хочу знать, есть личто-нибудь, что я могу сделать, чтобы отложить это, или отменить это, чтобы я мог установить кучу рабочего стола?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...