· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› MultyDesk, SetThreadDesktop и иже с ними

Посл.отвђт Сообщенiе


Дата: Июл 10, 2004 11:16:01

Добрый день all.
Решил написать программу, которая будет работать на своем десктопе (нечто вроде multydesk из winnt4rk).
Собственно говоря - себе (своему приложению) я смог установить нужный мне десктоп, и работать на нем. Но теперь возникла необходимость приложениям которые я использую устанавливать мой десктоп. А именно - Internet Explorer-у.
Но здесь возникла следующая проблема :
1) SetThreadDesktop не будет работать , если у потока уже есть окна на текущем десткопе. Помимо всего - он работает только для вызывающего потока.
2) SetProcessWindowStation работает только для вызывающего процесса.
3) Если я себе делаю SetThreadDesktop, то если потом делать ShellExecute из этого потока, то процесс создается на дефолтном юзерском десктопе.

Может кто-нибудь подкинет идею как мне запустить процесс на нужном мне десктопе?
Спасибо.


Дата: Июл 10, 2004 14:07:08

В структуре STARTUPINFO есть поле lpDesktop, вроде это оно.


Дата: Июл 10, 2004 16:27:01

Помню очень смутно, поэтому могу ошибиться. Где-то в MSDN была статья или цикл статей Keith Brown. И что-то там было про мигрирование на другие десктопы. Вроде у каждой WindowStation есть десктоп по умолчанию. Например "WinSta0\Default". И вроде как-то можно на него мигрировать. Попробуй посмотреть те статьи, может даст те чё.


Дата: Июл 11, 2004 11:48:58
Правка

Я не много знаю о таком, но:

rst
„если у потока уже есть окна на текущем десткопе“
Закрыть их?

„SetProcessWindowStation работает только для вызывающего процесса“
Можно внедриться в адресное пространство целевого процесса.

„как мне запустить процесс на нужном мне десктопе“
CreateProcess(), заполняем lpDesktop, но в msdn сказано, что только на WinSta0 десктопы интерактивны, а на остальных — нет. Под интерактивностью понимается получение приложением событий от мыши, клавиатуры (пользовательский ввод) и ещё что-то. Подробнее в MSDN (About services->Interactive
services), ссылку не помню.


Дата: Июл 11, 2004 17:16:45

Вообще...
//
// If no desktop has been specified, use the caller's
// desktop.
//

соответсвенно - я в основном потоке своего приложения делаю CreateDesktop и SetCurrentDesktop
потом все, что вызывается через CreateProcess - выполняется на моем десктопе.
Кстати. момент важный - именно CreateProcess а не ShellExecute ибо последний дает комманду эксплореру на выполнение, а не вызывает сам CreateProcess. Соответсвенно это будет выполнено на десктопе эксплорера.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076