在程式中如何將自己的程式做為當前視窗? |
尚未結案
|
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
自己搜尋雖然會多花很多時間,但也會累積你的經驗,所以,建議自己搜尋相關的資料.搜尋的關鍵字,可以用"重覆執行","執行",應該可以找到你要的資料
引言: 各位前輩大家好! 我有一個程式有控制只能運行一次.再次運行的時候,有時可能不在當前視窗, 所以想請問一下,如何判斷執行程式不在當前視窗以及怎麼讓它成為當前視窗?謝謝! 不好意思,可能本站上已有類似問題的解答,但是可能是我不知道以什麼關鍵字搜索好.所以也沒發現.還請版大和各位朋友見諒,也順便麻煩幫忙解答一下.感謝! 發表人 - >>< face="Verdana, Arial, Helvetica"> 發表人 - change.jian 於 2005/05/26 16:10:10 |
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
|
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
首先感謝change.jian版大,Stallion大大的回覆! 其實我的程式已經控制好不能重覆執行(如下代碼).
現在的問題是:
比如說先運行我的程式mytest,再縮到最小,然後在桌面打開'我的電腦',這樣mytest的程式就不在當前視窗了.也就是沒有得到焦點,在這個時候如果我不知道程式已打開,再次另外重新啟動我的程式的時候,沒有反應,我想要怎麼做如果再次打開程式時我的程式自動在當前視窗?(不是說讓視窗保持在最上層).謝謝
希望各位大大這回能看得明白. < class="code">
var
FindHwnd:HWND;
begin
FindHwnd:=FindWindow('TApplication','mytest');
if FindHwnd=0 then
begin
Application.Initialize;
Application.Title := 'mytest';
Application.CreateForm(TForm1, Form1);
Application.Run;
end ;
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
to: change.jian版主大人 謝謝您!您的回覆讓我受益良多,讓我又學多一種判斷重覆執行程式的方法.
但是我的問題還是沒有解決啦!
參考版主大人的范例是多一個提示,但是不會將原已打開的程式得到Focus或Activate,
比如說可以這樣操作:
先打開程式mytest,然後縮至最小,然後再到檔案總管找到mytest.exe這次程式再打開一次,提示'本程式已經在執行中',希望能夠點擊確定之後自動將原來已打開的程式mytest做為當前視窗(也就是馬上可以看到程式視窗中的畫面).也就是工具列mytest是激活的.如下圖 謝謝!
< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=22515981&CC=503559">
|
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
var FindHwnd:HWND; begin FindHwnd:=FindWindow('TApplication','mytest'); if FindHwnd=0 then begin Application.Initialize; Application.Title := 'mytest'; Application.CreateForm(TForm1, Form1); Application.Run; end else begin 加上這一段看看! SetForgroundWindow(FindHwnd); ShowWindow(FindHwnd, SW_RESTORE); Halt; //關掉新開的程式 end;----------------------------------------------- Creation is the fundation of promotion. |
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
瞭解你的意思了,你的程式有bug,所以修改了一下,如下:
program mytest; uses Forms, Windows, SysUtils, Dialogs, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} var FindHwnd:HWND; WndText:array[0..254] of char; WTLength:integer; function HWndGet(PartTitleText:string;NotHwnd:HWND):HWND; var h:HWND; WndText:array[0..254] of char; WTLength:integer; begin PartTitleText:=UpperCase(PartTitleText); h:=FindWindow(nil,nil); while h<>0 do begin WTLength:=GetWindowText(h,WndText,255); if (PartTitleText = UpperCase(String(WndText))) and (h <>NotHwnd ) then break; h:=GetWindow(h,GW_HWNDNEXT); end; Result:=h; end; begin FindHwnd:=HWndGet('mytest',Application.Handle); if (FindHwnd=0) then begin Application.Initialize; Application.Title := 'mytest'; Application.CreateForm(TForm1, Form1); Application.Run; end else begin ShowMessage('程式已啟動'); SetForegroundWindow(FindHwnd); end; end.發表人 - change.jian 於 2005/05/27 13:08:17 |
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
我執行了一下你的程式,發現雖然
FindWindow回傳一個HWnd,不過回傳的handle並不正確,我不知道為什麼(我對API不是很熟),但這裡會出現一個bug,即使FindWindow是正確回傳了名為mytest的application.Handle,但這個很有可能是本身的handle值,所以我另外加了一個HWndGet function,一方面解決findWindow的問題(也許你的環境run沒有問題),一方面解決避免findwindow找到的是自己的handle(這也是為什麼呼叫HWndGet的參數,會傳入Application.Handle的原因)....當然.程式碼越簡單越好,如果執行起來沒有問題,當然Stallion大大的為佳
引言: 非常感謝Stallion大大及change.jian版大解答. 兩位大大提供的方法我都測試OK. Stallion大大的方法看起比較簡潔,我想一般的人都比較樂於接受吧, 另外>>< face="Verdana, Arial, Helvetica"> 發表人 - change.jian 於 2005/05/27 14:49:06 |
zxy666666
中階會員 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |