有时需要从命令行打开新程序(例如windows Powerpoint演示文稿,因为幻灯片可以通过命令行“ powerpnt.exe /s ”打开),最大化该程序并将其作为用户可以看到的第一个程序并使用。 如果用户在命令提示符中直接input命令,则默认情况下会发生,因为命令提示符是活动窗口。
但问题是 – 如何执行此 *** 作,如果命令行是从后台进程执行的 – 例如来自windows Task Scehduler的自定义windows服务应用程序 – 在这两种情况下,新窗口不会作为第一个窗口。
目前我可以想象只有相当困难的解决scheme(其缺点是他们需要编码,并且不能在任务调度器中使用):
可以尝试获取已打开程序的主窗口的句柄,并 *** 作该窗口 – 例如最大化等;
可以尝试放弃命令行,而是将windows Office应用程序作为COM对象进行 *** 作。
也许有更简单的方法?
知道是否有权限删除它的文件或目录在C#
保护我的Java应用程序不被复制(仅适用于一台电脑)
如何获得富文本框字符颜色?
开发桌面小工具的程序/工具?
linux桌面UI自动化工具
build立一个基于WebKit的windows应用程序的最快/最简单的方法?
在windows中检测笔记本电脑上的耳机
将函数包装到windows桌面应用程序的最佳做法是什么?
如何build立一个用户友好的filter
一个windows桌面应用程序的想法
您可以创建一个小的(非gui)启动器应用程序,为您调用新程序(我知道,这就是您称之为硬解决方案),然后在任务调度器上调度此启动器。
这个启动器应用程序将不得不创建de process( CreateProcess函数 ),然后从pID获得窗口句柄…使用窗口句柄,您可以使用SetForegrounDWindow来执行您所需的 *** 作,或调用其他函数,如最大化等。
既然你标记了delphi,我发布了一个可能的delphi实现。
function WindowFromPID(pID: Cardinal; VisibleWindow: Boolean): Cardinal; type TProcdata = record pID: Cardinal; pHandle: Cardinal; VisibleWindow: Boolean; end; var wPData: TProcdata; function EnumProc(Handle: HWND; var pProcdata: TProcdata): Bool; stdcall; var pID: DWORD; begin Result := True; if pProcdata.VisibleWindow then if not IsWindowVisible(Handle) then Exit; GetwindowThreadProcessID(Handle,@pID); if pID = pProcdata.pID then begin if Getwindow(Handle,GW_OWNER) = 0 then begin pProcdata.pHandle := Handle; Result := false; end; end; end; begin wPData.pHandle := 0; wPData.pID := pID; wPData.VisibleWindow := VisibleWindow; Enumwindows(@EnumProc,Integer(@wPData)); while (wPData.pHandle = 0) do begin Sleep(50); Enumwindows(@EnumProc,Integer(@wPData)); end; Result := wPData.pHandle; end; procedure RunAndGetwindowHandle(const filename,Params: String; const windowstate: Word): Cardinal; var SUInfo: TStartupInfo; Cmdline: String; ProcInfo: TProcessinformation begin Cmdline := '"' + filename + '"' + Params; FillChar(SUInfo,SizeOf(SUInfo),#0); with SUInfo do begin cb := SizeOf(SUInfo); DWFlags := StartF_UseShowWindow; wShowWindow := windowstate; end; if not CreateProcess(Nil,PChar(Cmdline),nil,False,Create_New_Console Or normal_Priority_Class,PChar(ExtractfilePath(filename)),SUInfo,ProcInfo) then raise Exception.Create('Error running process'); if WaitForSingleObject(ProcInfo.hProcess,50) <> WAIT_TIMEOUT then raise Exception.Create('Error running process!'); CloseHandle(ProcInfo.hThread); while Result = 0 do begin Sleep(50); Result := WindowFromPID(ProcInfo.DWProcessID,true); end; end; ... var WindowHandle: Cardinal; begin WindowHandle := RunAndGetwindowHandle("powerpnt.exe"," /s",SW_SHOWnorMAL); SetForegrounDWindow(WindowHandle); end;
希望这就是你需要..对不起,如果不是。
最好的祝福。
创建一个打开所需程序的批处理文件,并让Task Scheduler运行该文件 。
批处理文件将运行,就像用户直接将命令输入命令提示符一样,您将得到所需的结果。
总结以上是内存溢出为你收集整理的如何从命令行或其他应用程序打开并引入桌面应用程序?全部内容,希望文章能够帮你解决如何从命令行或其他应用程序打开并引入桌面应用程序?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)