本文链接:https://blog.youkuaiyun.com/xuangege/article/details/3451136
今天由于要配合同事使用DCS软件开发一套工业控制软件,而DCS软件需要勾买,否则每次只能用两个小时,又要重启一次方可使用,所以就想到用delphi来解决这个问题,这样我们的那个工业控制软件就可以拿去进行实时监控了,设想的方案是这样的:通过用DELPHI来编写一个软件,通过此软件来启动DCS软件,然后每隔两个小时就自动关闭DCS软件又重启DCS软件,这样就可以正常使用了,一想觉得简单,所以就动手做了,可是做了之后才发现,DCS这个软件不像我们平常的一些软件,无法通过findwindow函数找到他的窗口句柄,试通过一些进程查找函数查找并结束进程的方式解决,结果也行不通,真的很奇怪,而且启动DCS软件时还要不断的用鼠标点击弹出来的几个提示窗口方能进入到要看的界面,想到这点我就有办法了,可以通过模拟按键的方法来解决以上的所有问题,于是就做到了。。。。。。呵呵!大家可以拿去试试,应该也可以用于其它的软件,特别是在网上看到的一些说用findwindow函数无法结束外部程序的问题,我想你也可以用此方法试试:
var
Form1: TForm1;
hParent: HWND;
filestr:string;
jgtime:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
if filestr<>'' then //要启动的软件路径
begin
zqdcs.InTerval:=jgtime; //重启间隔时间设定
dcsqt.Enabled:=true; //自动重启时钟
hParent:=Form1.Handle;//本软件窗口句柄
end
else
begin
showmessage('请先初始化本软件系统,否则无法运行!');
Form1.WindowState:=wsNormal;
end;
end;
procedure TForm1.dcsqtTimer(Sender: TObject);
begin
if (hParent <> 0) then
ShellExecute(handle,'open',Pchar(filestr),nil,nil,sw_shownormal); //启动外部软件
sleep(3000); //延时3S
keybd_event(ord(82), MapVirtualKey(ord(82), 0 ),0, 0 );//模拟按键R按下
keybd_event(ord(82), MapVirtualKey(ord(82), 0 ),KEYEVENTF_KEYUP, 0 );模拟按键R放开
sleep(3000);
SetCursorPos(50,10);// 以下开始模拟鼠标
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
dcsqt.Enabled:=false;
sleep(8000);
zqdcs.Enabled:=true;
dcsqt.Enabled:=false;
end;
procedure TForm1.zqdcsTimer(Sender: TObject);
begin
closedcs.Enabled:=true;
end;
procedure TForm1.closedcsTimer(Sender: TObject);
begin
//ALT+f4组合键
keybd_event(ord(18), MapVirtualKey(ord(18), 0 ),0, 0 );
keybd_event(VK_F4, VK_F4,0, 0 );
keybd_event(VK_F4, VK_F4,KEYEVENTF_KEYUP, 0 );
keybd_event(ord(18), MapVirtualKey(ord(18), 0 ),KEYEVENTF_KEYUP, 0 );
//ALT+X组合键
keybd_event(ord(18), MapVirtualKey(ord(18), 0 ),0, 0 );
keybd_event(ord(88), MapVirtualKey(ord(88), 0 ),0, 0 );
keybd_event(ord(88), MapVirtualKey(ord(88), 0 ),KEYEVENTF_KEYUP, 0 );
keybd_event(ord(18), MapVirtualKey(ord(18), 0 ),KEYEVENTF_KEYUP, 0 );
//回车键
keybd_event(ord(13), MapVirtualKey(ord(13), 0 ),0, 0 );
keybd_event(ord(13), MapVirtualKey(ord(13), 0 ),KEYEVENTF_KEYUP, 0 );
closedcs.Enabled:=false;
sleep(10000);
dcsqt.Enabled := true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if trim(file_edit.Text)<>'' then
filestr:= trim(file_edit.Text)
else
showmessage('请先选择软件路径');
if trim(jg_edit.Text)<>'' then
jgtime:= strtoint(trim(jg_edit.Text))
else
showmessage('请设置时间间隔');
if filestr<>'' then
begin
Form1.WindowState:=wsMinimized;
zqdcs.InTerval:=jgtime;
dcsqt.Enabled:=true;
hParent:=Form1.Handle;
end
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Application.Terminate;
end;
————————————————
版权声明:本文为优快云博主「lek608」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/xuangege/article/details/3451136