我正在开发一个类似于信息亭的应用程序。应用程序启动后,它将创建功能有限的新桌面。使用组合键,我可以在桌面之间来回移动。为了通知用户当前正在使用的桌面或我创建的应用程序的其他任何信息,其中显示气球消息的是“系统任务栏”区域。
在新创建的桌面中,我使用函数启动explorer.exeCreateProcess
,并通过STARTUPINFO
结构提供新桌面,并在结构中返回该过程的句柄PROCESS_INFORMATION
。
使用相同的技术,我试图在新桌面中启动图标任务栏应用程序,从而在STARTUPINFO
结构中提供新桌面。问题在于,根据任务管理器,应用程序正在运行,但是未显示任务栏图标。
我的直觉说,在新桌面中,未显示图标,因为它不是新explorer.exe进程的子级,来自live.systernals的procexp应用程序以树表示形式在同一级别上显示这两个进程。
有没有一种方法可以提供一个参数CreateProcess
,也许是资源管理器进程句柄,以便图标任务栏应用程序作为该进程的子级启动?
LE:这是我用来创建启动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
将为您提供大量的阅读材料。最大的问题是,您的过程必须与目标相同。有3种替代使用方式:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句