線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1436
推到 Plurk!
推到 Facebook!

在程式中如何將自己的程式做為當前視窗?

尚未結案
zxy666666
中階會員


發表:108
回覆:150
積分:86
註冊:2005-01-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-26 14:56:48 IP:219.130.xxx.xxx 未訂閱
各位前輩大家好!    我有一個程式有控制只能運行一次.再次運行的時候,有時可能不在當前視窗, 所以想請問一下,如何判斷執行程式不在當前視窗以及怎麼讓它成為當前視窗?謝謝! 不好意思,可能本站上已有類似問題的解答,但是可能是我不知道以什麼關鍵字搜索好.所以也沒發現.還請版大和各位朋友見諒,也順便麻煩幫忙解答一下.感謝! 發表人 -
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-26 15:50:59 IP:61.218.xxx.xxx 未訂閱
自己搜尋雖然會多花很多時間,但也會累積你的經驗,所以,建議自己搜尋相關的資料.搜尋的關鍵字,可以用"重覆執行","執行",應該可以找到你要的資料
引言: 各位前輩大家好! 我有一個程式有控制只能運行一次.再次運行的時候,有時可能不在當前視窗, 所以想請問一下,如何判斷執行程式不在當前視窗以及怎麼讓它成為當前視窗?謝謝! 不好意思,可能本站上已有類似問題的解答,但是可能是我不知道以什麼關鍵字搜索好.所以也沒發現.還請版大和各位朋友見諒,也順便麻煩幫忙解答一下.感謝! 發表人 - >< face="Verdana, Arial, Helvetica"> 發表人 - change.jian 於 2005/05/26 16:10:10
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-26 23:09:58 IP:211.22.xxx.xxx 未訂閱
formstyle := fsstayonTop可以讓視窗保持在最上層,另外如要程式只能執行一次,請用FINDWINDOW或CREATEMUTEX關鍵字在站裡搜尋,範例非常多! ----------------------------------------------- Creation is the fundation of promotion.
zxy666666
中階會員


發表:108
回覆:150
積分:86
註冊:2005-01-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-27 08:26:54 IP:218.16.xxx.xxx 未訂閱
首先感謝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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-27 10:55:28 IP:61.218.xxx.xxx 未訂閱
如下:
begin      CreateMutex(nil, True, 'KAPMis');
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    MessageBox(0, PChar('本程式已經在執行中'), 'KAPMis', MB_ICONERROR);
    Halt;
  end;      Application.Initialize;
  //.......
  Application.Run;
end.    
zxy666666
中階會員


發表:108
回覆:150
積分:86
註冊:2005-01-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-27 11:40:19 IP:218.16.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-27 12:24:53 IP:211.22.xxx.xxx 未訂閱
 
 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-27 13:04:33 IP:61.218.xxx.xxx 未訂閱
瞭解你的意思了,你的程式有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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-27 14:13:25 IP:218.16.xxx.xxx 未訂閱
非常感謝Stallion大大及change.jian版大解答.    兩位大大提供的方法我都測試OK. Stallion大大的方法看起比較簡潔,我想一般的人都比較樂於接受吧, 另外
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-05-27 14:41:29 IP:61.218.xxx.xxx 未訂閱
我執行了一下你的程式,發現雖然 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-05-27 14:57:46 IP:218.16.xxx.xxx 未訂閱
感謝版主耐心的教導! 說句實在話Ktop為我解決了不少問題,真的很感謝您! 要不是您的陪伴我這個Delphi新手可能很難堅持到底. 祝Ktop的朋友們:好人一生平安,幸福!
系統時間:2024-07-04 5:17:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!