全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3267
推到 Plurk!
推到 Facebook!

如何得知視窗工作列上所有正在執行的程式名稱 ? PartⅡ

尚未結案
jaya
初階會員


發表:9
回覆:70
積分:30
註冊:2002-05-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-23 00:33:39 IP:220.135.xxx.xxx 未訂閱
在看到  http://delphi.ktop.com.tw/topic.php?TOPIC_ID=59822 的討論資料後,馬上在自己的電腦試用。Zard 提供的方式確實可以找到工作列的應用程式清單。 可是在遇到 Netterm 時,就出現問題了 由於 Netterm 會在標題列秀出自定的連線名稱(ex:bbs.kimo.com.tw) Zard 的方法會抓到連線名稱(bbs.kimo.com.tw),而看不到 Netterm 的程式名稱 請問有辦法可以解決這樣的問題嗎? 希望能像IE一樣,出現「Netterm - bbs.kimo.com.tw」 jaya上
allenchan
資深會員


發表:10
回覆:306
積分:283
註冊:2004-01-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-23 22:48:42 IP:61.62.xxx.xxx 未訂閱
如果您要抓到執行檔的名稱步驟挺麻煩的,需要動用到 PSAPI,因為我並沒有 Delphi,所以我用 BCB 來 改寫(我想應該差不了多少),程式內容引用 Zard 大大的文章。    http://delphi.ktop.com.tw/topic.php?TOPIC_ID=59822    程式需將 PSAPI.LIB 加進來,並且 include PSAPI.HPP。    程式執行完的結果會在 Zard 原先程式所秀出來的每一行下頭多一行執行檔名稱(含完整路徑)。    
bool _stdcall EnumWndProc(HWND hWin, LPARAM Param)
{
  char szBuf[100];
  // 取得所有可見的視窗
  if (IsWindow(hWin) && IsWindowVisible(hWin))
  {
    // 只取最上層可見視窗
    if (GetParent(hWin) == 0)
    {
      memset(szBuf, 0, sizeof(szBuf));
      GetWindowText(hWin, szBuf, sizeof(szBuf));
      if (strcmp(szBuf, ""))
      {
        TStringList *p = (TStringList*)Param;
        p->AddObject(szBuf, (TObject*)hWin);
      }
    }
  }
  return true;
}    void TForm1::ListAllActiveWnd(void)
{
  DWORD dwProcess1, dwProcess2;
  DWORD cnt;
  HWND hProc;
  HMODULE hMod[255];
  char szModName[255];      TStringList *slWnd = new TStringList ;
        
  // 用 EnumWindows 列舉出所有可能的視窗, 並記在TStringList中
  EnumWindows((WNDENUMPROC)EnumWndProc, (LPARAM)slWnd);      Memo1->Lines->Clear();      // 比對所有可能的視窗, 去掉屬於同一個Process的視窗
  // 最後一個一定是Program Manager, 所以loop只到slWnd.Count - 2, 直接去掉
  // Program Manager
  for (int i = 0; i <= slWnd->Count - 2; i  )
  {
    GetWindowThreadProcessId((HWND)(slWnd->Objects[i]), &dwProcess1);
    GetWindowThreadProcessId((HWND)(slWnd->Objects[i   1]), &dwProcess2);
        
    if (dwProcess1 != dwProcess2) 
    {
      Memo1->Lines->Add(slWnd->Strings[i]);          // 以下為取得執行檔名稱的過程
       hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, dwProcess1);
      if (hProc)
      {
        EnumProcessModules(hProc, hMod, 255, &cnt);
        memset(szModName, 0, sizeof(szModName));
        if (GetModuleFileNameEx(hProc, hMod[0], szModName, sizeof(szModName)))
        {
           // szModName 即為執行檔名稱含完整路徑
            Memo1->Lines->Add(szModName);
        }
        CloseHandle(hProc);
      }
    }
  }
  delete slWnd;
}    void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ListAllActiveWnd();
}
希望對您有幫助囉 ~~ ^^ Allen Chan
jaya
初階會員


發表:9
回覆:70
積分:30
註冊:2002-05-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-24 23:05:05 IP:220.135.xxx.xxx 未訂閱
謝謝 Allen Chan 的熱心幫忙 。 只是我沒用過 > ,目前對
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-02 02:31:45 IP:219.68.xxx.xxx 未訂閱
I'm BCB & DELPHI Converter < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=19013824&CC=425236"> The source code? please see here < class="code"> unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,PSAPI; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } Procedure ListAllActiveWnd(); end; var Form1: TForm1; implementation {$R *.DFM} Procedure TForm1.ListAllActiveWnd(); type PStringList = ^TStringList; Function EnumWndProc(hWin: HWND; Param: LPARAM): BOOL; stdcall; var szBuf: array[0..100] of Char; begin // 取得所有可見的視窗 if (IsWindow(hWin) and IsWindowVisible(hWin)) then begin // 只取最上層可見視窗 if (Windows.GetParent(hWin) = 0) then begin FillChar(szBuf, SizeOf(szBuf), 0); GetWindowText(hWin, szBuf, SizeOf(szBuf)); if (szBuf <> '') then PStringList(Param)^.AddObject(szBuf, TObject(hWin)); end; end; Result := TRUE; end; var i: Integer; slWnd: TStringList; dwProcess1, dwProcess2: DWORD; cnt:DWORD; szModName:array [0..255]of char; hProc:THandle; hMod: HMODULE; begin slWnd := TStringList.Create; // 用 EnumWindows 列舉出所有可能的視窗, 並記在TStringList中 EnumWindows(@EnumWndProc, LPARAM(@slWnd)); Memo1.Lines.Clear; // 比對所有可能的視窗, 去掉屬於同一個Process的視窗 // 最後一個一定是Program Manager, 所以loop只到slWnd.Count - 2, 直接去掉 // Program Manager for i := 0 to slWnd.Count-2 do begin GetWindowThreadProcessId(HWND(slWnd.Objects[i]), @dwProcess1); GetWindowThreadProcessId(HWND(slWnd.Objects[i + 1]), @dwProcess2); if dwProcess1 <> dwProcess2 then begin //Memo1.Lines.Add(slWnd.Strings[i]); // 以下為取得執行檔名稱的過程 hProc:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, dwProcess1); if (hProc)<>0 then begin FillChar(szModName, SizeOf(szModName), 0); EnumProcessModules(hProc, @hMod, SizeOf(hMod), cnt); if GetModuleFileNameEx(hProc, hMod, szModName,sizeof(szModName))<>0 then begin Memo1.Lines.Add(slWnd.Strings[i]+'--->'+szModName); end; CloseHandle(hProc); end; end; end; slWnd.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin ListAllActiveWnd; end; end. it's different with Zard's program that codes color are "RED" GOOD LUCK <> <> <> < > <> < class="code"> =程式是一種藝術 也是訓練自己的分析規劃= =是段落分明 或是雜亂無章= =是一言以敝 或是廢話連篇= =是一目了然 或是艱深難懂= 體會這份藝術 您會了解另一份喜悅與成就
發表人 - geniustom 於 2004/12/02 02:36:55
jaya
初階會員


發表:9
回覆:70
積分:30
註冊:2002-05-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-03 00:05:34 IP:220.135.xxx.xxx 未訂閱
非常感謝二位的回覆~
alvin26
初階會員


發表:24
回覆:41
積分:28
註冊:2005-04-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-12 16:59:46 IP:211.20.xxx.xxx 未訂閱
這裡用到 process 和 thread 的觀念, 可是小弟我對這觀念幾乎等於零, 可否推薦幾本書讓小弟KK呢?   感謝感謝~
------
弟子規,聖人訓,首孝悌,次謹信,泛愛眾,而親仁,有餘力,則學文。
lilicoco119119
一般會員


發表:4
回覆:4
積分:1
註冊:2003-11-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-22 10:19:55 IP:211.22.xxx.xxx 未訂閱
我把bcb的程式碼稍微給它試了一下,結果出現這個嘢 [Linker Error] Unresolved external 'EnumProcessModules' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ 和 [Linker Error] Unresolved external 'GetModuleFileNameExA' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ 大大可以教一下如何解決嗎
系統時間:2024-05-02 13:38:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!