如何将应用程序作为新创建的资源管理器进程的子进程启动
How to start an application as a child of a newly created explorer process?
我正在开发一个类似于kiosk的应用程序。应用程序启动后,它会创建一个功能有限的新桌面。使用组合键我可以在桌面之间来回移动。为了通知用户当前正在使用的桌面,或任何其他信息,我已经创建了一个应用程序,它显示气球消息是系统托盘区域。
在新创建的桌面中,我使用CreateProcess
函数启动explorer.exe,并通过STARTUPINFO
结构提供新的桌面,并且我在PROCESS_INFORMATION
结构中返回进程的句柄。
使用相同的技术,我试图在新桌面中启动图标托盘应用程序,提供STARTUPINFO
结构的新桌面。问题是,根据任务管理器,应用程序正在运行,但是没有显示托盘图标。
我的直觉告诉我,在新的桌面中,图标没有显示,因为它不是新的explorer.exe进程的子进程,即procexp应用程序。systemals以树的形式在同一层次上显示这两个过程。
是否有办法为CreateProcess
提供一个参数,也许是资源管理器进程句柄,以便图标托盘应用程序作为该进程的子进程启动?
L.E.以下是我用来创建启动explorer.exe和图标托盘进程的代码:
STARTUPINFO sInfoNT; /// startupinfo for the explorer.exe
PROCESS_INFORMATION pInfoNT; /// process infromation for the explorer.exe
ZeroMemory(&sInfoNT, sizeof(sInfoNT));
sInfoNT.lpDesktop = L"threadDesktop"; /// setting the desktop for the process
pInfoNT = startProcess(sInfoNT, L"C:\Windows\explorer.exe"); /// starting the process
if (!pInfoNT.hProcess)
LOG(ERROR) << "Unable to start the new explorer process";
else
LOG(INFO) << "Started the new explorer process";
STARTUPINFO sInfoTITD; /// doing the same thing for the tray icon application
PROCESS_INFORMATION pInfoTITD;
ZeroMemory(&sInfoTITD, sizeof(sInfoTITD));
sInfoTITD.lpDesktop = L"threadDesktop";
pInfoTITD = startProcess(sInfoTITD, L"DesktopTrayIcon.exe");
if (!pInfoTITD.hProcess)
LOG(ERROR) << "Unable to start the tray icon for the new desktop";
else
LOG(INFO) << "Started the tray icon for the new desktop";
这是startProcess
函数:
PROCESS_INFORMATION KioskLauncher::startProcess(STARTUPINFO startUpInfo, LPCTSTR lpApplicationName)
{
PROCESS_INFORMATION processInformation;
ZeroMemory(&processInformation, sizeof(processInformation));
if (!CreateProcess(lpApplicationName, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startUpInfo, &processInformation))
MessageBox(0, L"Unable to start the process!nThe path is broken!", L"Path Error!", MB_ICONERROR);
return processInformation;
}
如果您真的想让新进程成为另一个进程的子进程,您必须使用代码注入。搜索CreateRemoteThread
会给你提供大量的阅读材料。最大的问题是,您的过程必须与目标具有相同的位。有三种方法可以使用它:
- Dll注入(标准)
- 注入实际的shellcode:将解析所有依赖项本身的汇编代码。
- 从应用程序中复制一段代码并修复导入(Tricky)
相关文章:
- 如何维护资源管理器项目视图中当前可见的项目列表
- 编译器资源管理器和 GCC 具有不同的输出
- Windows 资源管理器中的图标在使用 resource.rc 时显示 2 个不同的图标
- 编译器资源管理器(godbolt)如何安全地运行代码?
- 从 GUI 文件资源管理器执行程序,并且不生成终端
- Visual Studio 测试资源管理器找不到我的提升测试
- 通过文件资源管理器获取文件夹目录
- Windows 资源管理器打开文件夹还原
- 如何使用C 浏览目录以创建文件资源管理器
- C++ Android 资源管理器从应用内部目录中读取文件
- 停止SetVolumeMountPoint打开文件资源管理器
- 重新启动资源管理器.exe使用 C++
- 资源管理器
- Visual Studio,在(解决方案资源管理器的)某个筛选器内的所有文件中查找/替换文本
- SHOpenFolder并选择资源管理器更换程序的项目
- 如何在 Windows 资源管理器中捕获用户的左键单击?
- 如何将设备隐藏在资源管理器中
- 资源管理器在 TILE 视图模式下不显示 shell 命名空间扩展的项目详细信息
- 如何在用户创建的库中打开 Windows 资源管理器
- 如何将应用程序作为新创建的资源管理器进程的子进程启动