CreateDesktop и DDE - PullRequest
       3

CreateDesktop и DDE

1 голос
/ 03 февраля 2012

Я настраиваю рабочий стол с нуля для запуска другого приложения в «тихом режиме» - другое приложение шумит и выбрасывает всевозможные окна во время обработки.

Я использовал информацию здесь: CreateDesktop () с Vista и UAC на (C, Windows)

и CreateDesktop работает - я могу создать другой рабочий стол, я могу запустить приложение на другом рабочем столе (я вижу, что он запускается в диспетчере задач) - но когда я пытаюсь взаимодействовать с приложением через DDE, вызов DdeConnect зависает до время истекло.

А вот как я называю CreateDesktop:

                LPSTR desktopName = "MYDESKTOPNAME";
                HDESK hDesk = CreateDesktop(desktopName , NULL, NULL, 0, DESKTOP_SWITCHDESKTOP|
                                          DESKTOP_WRITEOBJECTS|
                                          DESKTOP_READOBJECTS|
                                          DESKTOP_ENUMERATE|
                                          DESKTOP_CREATEWINDOW|
                                          DESKTOP_CREATEMENU, NULL);

Вот CreateProcess для фактического запуска приложения на новом рабочем столе:

                STARTUPINFO startupInfo;
                GetStartupInfo(&startupInfo);
                startupInfo.lpDesktop = desktopName;

                PROCESS_INFORMATION procInfo;
                memset(&procInfo, 0, sizeof(procInfo));


                if (CreateProcess(NULL, exePath, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &procInfo)){
                    WaitForInputIdle(procInfo.hProcess, INFINITE);
                    CloseHandle(procInfo.hProcess);
                    CloseHandle(procInfo.hThread);
                }

Если это имеет значение, вызов DdeInitialize:

DWORD afCmd = APPCLASS_STANDARD | APPCMD_CLIENTONLY | CBF_SKIP_ALLNOTIFICATIONS;
UINT rslt = ::DdeInitialize(&ddeInst, NULL, afCmd, 0);

Вот вызов DdeConnect (параметры hsz * и т. Д. Все в порядке - если я запускаю приложение на обычном рабочем столе, все вызовы работают отлично).

        hConv = ::DdeConnect(ddeInst,
                               hszService,
                               hszTopic,
                               NULL);

Этот звонок просто висит на ~ 60 секунд.

Это какая-то проблема безопасности? то есть сообщения Windows не проходят между рабочими столами? Или у кого-нибудь есть предложения по дальнейшему устранению неполадок?

Ответы [ 2 ]

4 голосов
/ 03 февраля 2012

Документация для CreateDesktop содержит перекрестную ссылку на тему Настольные компьютеры , в которой говорится

Сообщения окна могут отправляться только между процессамикоторые находятся на одном рабочем столе.

Важны темы обзора.Они предоставляют справочную информацию, чтобы помочь вам понять функцию.

1 голос
/ 03 февраля 2012

Раймонд объясняет, почему сообщения не проходят.Чтобы решить эту проблему, если вы продолжите работу с отдельным рабочим столом, вам просто нужно будет запустить процесс, выполняющий DDE на том же рабочем столе, что и целевое приложение.Если вам необходимо установить связь между вашим процессом на главном рабочем столе и целевым процессом, вам потребуется использовать другую форму IPC.

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