2012-02-03 5 views
1

"침묵 모드"에서 다른 응용 프로그램을 실행하기 위해 스크래치 데스크톱을 설정 중입니다. 다른 응용 프로그램은 시끄럽고 처리하는 동안 모든 종류의 창을 던집니다. 내가하려고 할 때 -하지만 내가 다른 바탕 화면을 만들 수 있습니다, 나는 (내가이 작업 관리자에 실행 참조) 다른 바탕 화면에 응용 프로그램을 시작할 수 있습니다 - CreateDesktop() with vista and UAC on (C, windows)CreateDesktop 및 DDE

및 CreateDesktop 작동 : 나는 여기에 정보를 사용했다

DDE를 통해 응용 프로그램과 상호 작용하려면 DdeConnect 호출이 시간 초과 될 때까지 중단됩니다.

   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 호출 : 여기

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

실제로 새로운 바탕 화면에 응용 프로그램을 실행하는 CreateProcess를 수 있습니다 :

그리고 여기에 내가 CreateDesktop를 호출하고있어 방법

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

저는 수년간 블로그를 읽은 것을 영광으로 생각합니다. 제어 프로세스를 같은 데스크탑으로 옮길 것입니다 - 감사합니다! –

1

Raymond가 메시지가 전달되지 않는 이유를 설명합니다. 이 문제를 해결하려면 별도의 데스크톱을 계속 사용한다고 가정하면 대상 응용 프로그램과 동일한 데스크톱에서 DDE를 수행하는 프로세스 만 실행하면됩니다. 메인 바탕 화면의 프로세스와 대상 프로세스 사이에서 통신해야하는 경우 다른 형태의 IPC를 사용해야합니다.

관련 문제