2016-11-18 8 views
0

フォーカスを表示したいWindowsシェルエクステンション(簡単なコンテキストメニュー)からWPFアプリケーションを起動しました。C#シェルエクステンションから起動されたC#UIアプリケーションにフォーカスを移す

は、UIアプリケーションは、コマンドラインから起動されたときにフォーカスし、アクティブに表示されますが、私は、Windowsの機能CreateProcessAsUserWを使用して、コンテキストメニューから起動したときにフォーカスせずに示しましたさ。次のコードでプロセスを作成すると、いくつかのパラメータ設定がありません。

bool launchProcessAsCurrentUser(HANDLE token, const std::wstring& command) 
{ 
    bool result = false; 
    void* environment = nullptr; 

    PROCESS_INFORMATION processInfo{ 0 }; 

    STARTUPINFOW startupInfo { 0 }; 
    ZeroMemory(&startupInfo, sizeof(startupInfo)); 
    startupInfo.cb = sizeof(startupInfo); 

    const bool impersonateUser = ImpersonateLoggedOnUser(token); 
    if (impersonateUser && CreateEnvironmentBlock(&environment, token, FALSE)) 
    { 
     SECURITY_ATTRIBUTES secA{ 0 }; 
     SECURITY_ATTRIBUTES secB{ 0 }; 
     result = CreateProcessAsUserW(token, 
             0, 
             const_cast<LPWSTR>(command.c_str()), 
             &secA, 
             &secB, 
             FALSE, CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, 
             environment, 
             0, 
             &startupInfo, 
             &processInfo); 
     DestroyEnvironmentBlock(environment); 
    } 
    else 
    { 
     //Log error 
    } 

    if (impersonateUser) 
    { 
     RevertToSelf(); 
    } 
    return result; 
} 

注:それが表示される前にのC#ウィンドウがフォーカスに設定されています。

よろしく、

+0

最後に、私はこのリンクに従いますhttps://www.roelvanlisdonk.nl/2014/09/05/reliable-bring-external-process-window-to-foreground-without-c/そしてそれは動作します! – Henry

答えて

0

スタートアップ情報を埋めることによってショーモードを設定し、明示的に試みることができる:

// see https://msdn.microsoft.com/en-us/library/windows/desktop/ms686331(v=vs.85).aspx 
startupInfo.dwFlags = STARTF_USESHOWWINDOW; 
startupInfo.wShowWindow = SW_SHOWNORMAL; 

また、あなたが作成しているプロセスは、ウィンドウのアプリではなく、コンソールであるため、アプリでは、CREATE_NO_WINDOWが外れているようです。

+0

こんにちは、お返事ありがとうございます。私はこれを試しましたが、それでも動作していません。動作は同じですが、UIはフォーカスなしで表示され、非アクティブです。 – Henry

+0

申し訳ありません、それは助けになりませんでした。アプリは実際にアクティブになっているかもしれませんが、その後いくつかの他のアプリがアクティブになるのでしょうか?あなたの新しいプロセスの代わりに*どのアプリケーション*がアクティブですか? – smocoder

+0

シナリオ:ファイルエクスプローラを開き、ファイルを右クリックしてコンテキストメニューを表示してから、自分のメニューをクリックしてWPFアプリケーションを開きます。ファイルエクスプローラのフォーカスが表示されますが、私のアプリケーションはありません。 – Henry

関連する問題