紧急:调用系统计算器问题 :避免同一个父窗口重复调用 以及 父窗口关闭时候也一并关闭的问题!(50分)

  • 主题发起人 主题发起人 dzl19
  • 开始时间 开始时间
D

dzl19

Unregistered / Unconfirmed
GUEST, unregistred user!
调用系统计算器问题<br>我在界面里调用系统的计算器,第一次用后没有关闭,第二次用时候怎样直接把上一次调用的计数器直接出现而不是再启动一个计数器!<br>我用 <br>use ShellAPI<br>var HWndCalc:HWnd;<br>ShellExceute(HWndCalc,nil,'calc',nil,nil,sw_normal); <br>仅完成简单调用。<br><br>请高手指点在调用该计数器时候该做如何的判断!!<br>另外,当我把调用该计数器的界面关闭时候,原则上也需要关闭该计数器,时间要应该如何处理呢?<br>急啊!!
 
procedure TForm1.Button1Click(Sender: TObject);<br>var HWndCalc:HWnd;<br>begin<br> &nbsp; HWndCalc:= FindWindow(nil, PChar('计算器'));<br> &nbsp; if HWndCalc&lt;&gt;0 then<br> &nbsp; &nbsp; ShowWindow(HWndCalc,sw_normal)<br> &nbsp; else<br> &nbsp; ShellExecute(self.Handle,nil,'calc',nil,nil,sw_normal);<br>end;<br><br>procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);<br>var HWndCalc:HWnd;<br>begin<br> &nbsp; HWndCalc:= FindWindow(nil, PChar('计算器'));<br> &nbsp; if HWndCalc&lt;&gt;0 then<br> &nbsp; &nbsp; SendMessage(HWndCalc,WM_CLOSE,0,0)<br>end;
 
同意楼上
 
回:<br>按照 yuzk2005 ,<br>1。在应用程序里可以只打开一次,但无法把活动焦点家到 计算器 上;<br>2。在应用程序运行之前先打开 计算器 ,然后运行应用程序,关闭应用程序,就会把计算器关闭了。<br><br>这个问题有谁发现过啊!!
 
1,SetWindowPos(HWndCalc, HWND_TOPMOST,........)可以试试这个函数。<br>2,当然会关闭啊,因为上面的代码是主窗体关闭时,检查计算器的handle,如果&gt;0则就会关闭,你把这段代码放到调用计算器的窗体close事件中就行了。
 
可是,按照 IT书生 我测不出来啊
 
type<br> &nbsp;TForm1 = class(TForm)<br> &nbsp; &nbsp;Button1: TButton;<br> &nbsp; &nbsp;procedure Button1Click(Sender: TObject);<br> &nbsp; &nbsp;procedure FormCreate(Sender: TObject);<br> &nbsp; &nbsp;procedure FormDestroy(Sender: TObject);<br> &nbsp;private<br> &nbsp; &nbsp;{ Private declarations }<br> &nbsp; &nbsp;CalcHandle: HWND;<br> &nbsp;public<br> &nbsp; &nbsp;{ Public declarations }<br> &nbsp;end;<br><br>var<br> &nbsp;Form1: TForm1;<br><br>implementation<br><br>{$R *.dfm}<br><br>uses<br> &nbsp;ShellAPI;<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br> &nbsp;CalcHandle := 0;<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br> &nbsp;if (CalcHandle &gt; 0) and &nbsp; &nbsp; &nbsp; //如果程序中启动了计算器<br> &nbsp; &nbsp; IsWindow(CalcHandle) then &nbsp;//并且没有被关闭,则显示<br> &nbsp; &nbsp;SetForegroundWindow(CalcHandle)<br> &nbsp;else begin<br> &nbsp; &nbsp;{ 检查是否有别的程序启动了计算器, 如果有则显示 }<br> &nbsp; &nbsp;CalcHandle := FindWindow(nil, PChar('计算器'));<br> &nbsp; &nbsp;if CalcHandle &gt; 0 then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;SetForegroundWindow(CalcHandle);<br> &nbsp; &nbsp; &nbsp;CalcHandle := 0; &nbsp; &nbsp; //设置0,说明计算器不是本程序启动的,退出时不关闭<br> &nbsp; &nbsp; &nbsp;Exit;<br> &nbsp; &nbsp;end;<br> &nbsp; &nbsp;{ 启动计算器,并记录其句柄 }<br> &nbsp; &nbsp;ShellExecute(Handle, nil, 'calc', nil, nil, SW_NORMAL);<br> &nbsp; &nbsp;repeat<br> &nbsp; &nbsp; &nbsp;CalcHandle := FindWindow(nil, PChar('计算器'));<br> &nbsp; &nbsp; &nbsp;Application.ProcessMessages;<br> &nbsp; &nbsp;until CalcHandle &gt; 0;<br> &nbsp;end;<br>end;<br><br>procedure TForm1.FormDestroy(Sender: TObject);<br>begin<br> &nbsp;if CalcHandle &gt; 0 then &nbsp; //如果程序中启动了计算器,则关闭它<br> &nbsp; &nbsp;SendMessage(CalcHandle, WM_CLOSE, 0, 0);<br>end;
 
谢谢,OK了!!
 
后退
顶部