我正在处理类似于自助服务终端的应用程序。应用程序启动后,它会创建一个功能有限的新桌面。使用键组合我可以在桌面之间来回移动。为了告知用户当前正在使用的桌面,或者我创建的应用程序的任何其他信息,即显示气球消息的是系统托盘区域。
在新创建的桌面中,我使用CreateProcess
函数启动 explorer.exe ,并通过STARTUPINFO
结构提供新桌面,我就是这样在PROCESS_INFORMATION
结构中返回进程的句柄。
使用相同的技术我尝试在新桌面中启动图标托盘应用程序,以STARTUPINFO
结构提供新桌面。问题是,根据任务管理器,应用程序正在运行,但托盘图标不会显示。
我的直觉说,在新桌面中,图标未显示,因为它不是新 explorer.exe 进程的子代, procexp 来自live.systernals的应用程序显示了这两个进程,在树表示中处于同一级别。
有没有办法向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;
}
答案 0 :(得分:1)
如果您真的想让新进程成为其他进程的子进程,则必须使用代码注入。搜索CreateRemoteThread
将为您提供大量阅读材料。最大的问题是,您的流程必须与目标相同。有3种替代方法可供使用: