将重点放在从c++ Shell扩展启动的c# UI应用程序上

本文关键字:启动 UI 应用 程序上 应用程序 扩展 Shell c++ | 更新日期: 2023-09-27 18:18:32

我有一个从Windows Shell扩展(一个简单的上下文菜单)启动的WPF应用程序,我想显示它的焦点

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#窗口在显示前被设置为对焦点。

问好,

将重点放在从c++ Shell扩展启动的c# UI应用程序上

您可以尝试通过填写启动信息来显式设置显示模式:

// 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似乎不合适。