将重点放在从c++ Shell扩展启动的c# UI应用程序上
Give focus to a C# UI Application launched from a C++ Shell Extension
我有一个从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#窗口在显示前被设置为对焦点。
问好,
您可以尝试通过填写启动信息来显式设置显示模式:
// 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似乎不合适。
相关文章:
- 如何在MS Visual Studio 2019中运行QT UI
- 如何创建一个空的全局类并在启动时实例化它
- 如何处理使用.ui文件生成的.h文件
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- 使用 std::string () const 函数启动线程或未来
- 根据变量使Qt UI中的复选框为已选中/未选中
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- 一旦双簧管录制开始,主 UI 线程就会被阻止
- 如何创建线程序列以按照启动顺序执行任务?
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 在挂钩启动新线程时解除挂钩进程
- 程序无法启动,因为缺少 libmpc-3.dll
- Qt Quick,如何更改 Ui 源代码?
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- QSerialPort 在应用程序启动之前正在使用中
- 无法在 Arch Linux 中启动虚幻引擎 4
- 线程在更新 UI 之前启动
- 将重点放在从c++ Shell扩展启动的c# UI应用程序上
- 正在为循环块UI从启动线程