CreateDesktop和DDE

时间:2012-02-03 02:11:11

标签: winapi

我正在设置一个临时桌面以“静音模式”运行另一个应用程序 - 另一个应用程序很嘈杂,并在处理过程中抛出各种各样的窗口。

我在这里使用了信息:CreateDesktop() with vista and UAC on (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 个答案:

答案 0 :(得分:4)

CreateDesktop的文档包含Desktops主题的交叉引用,其中包含

  

窗口消息只能在同一桌面上的进程之间发送。

概述主题很重要。它们提供背景信息以帮助您了解该功能。

答案 1 :(得分:1)

雷蒙德解释了为什么消息无法通过。为了解决这个问题,假设您继续使用单独的桌面,您只需要在与目标应用程序相同的桌面上运行执行DDE的过程。如果您需要在主桌面和目标进程之间进行通信,那么您将需要使用其他形式的IPC。