微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从命令行或其他应用程序打开并引入桌面应用程序?

有时需要从命令行打开新程序(例如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: TProcess@R_96_4045@ion 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运行该文件

批处理文件将运行,就像用户直接将命令输入命令提示符一样,您将得到所需的结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐