【问题标题】:Give focus to a C# UI Application launched from a C++ Shell Extension关注从 C++ Shell 扩展启动的 C# UI 应用程序
【发布时间】:2016-11-18 13:14:51
【问题描述】:

我有一个从 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# c++ wpf shell


【解决方案1】:

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

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

【讨论】:

  • 您好,感谢您的回复。我已经尝试过了,但仍然无法正常工作。行为是相同的,UI 没有焦点显示为非活动状态。
  • 抱歉没有帮助。可能是该应用程序实际上正在变得活跃,但其他一些应用程序随后立即变得活跃?哪个应用程序处于活动状态 而不是您的新进程?
  • 场景是:打开文件资源管理器,右键单击文件显示上下文菜单,然后单击我的菜单打开 WPF 应用程序。文件资源管理器出现焦点,但我的应用没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 2010-09-19
相关资源
最近更新 更多