2012-02-03 36 views
1

我正在設置一個臨時桌面以「靜音模式」運行另一個應用程序 - 另一個應用程序很嘈雜,並在處理時引發各種窗口。CreateDesktop和DDE

我用這裏的信息: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); 
       } 

如果它的事項,調用DDE初始化:

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消息沒有在桌面之間傳遞?或者有沒有人有任何建議如何進一步排除故障?

回答

4

CreateDesktop的文檔中包含的橫參照Desktops主題,它說

窗口消息可以僅是相同的桌面上的進程之間發送。

概述主題很重要。他們提供背景信息以幫助您瞭解該功能。

+0

我很榮幸 - 多年來一直在閱讀您的博客。我將把控制過程移到同一個桌面 - 謝謝! – 2012-02-03 17:24:44

1

Raymond解釋了爲什麼消息沒有通過。爲了解決這個問題,假設你繼續使用單獨的桌面,你只需要在與目標應用程序相同的桌面上運行執行DDE的過程。如果您需要在主桌面上的進程和目標進程之間進行通信,那麼您將需要使用其他形式的IPC。