如何得知視窗工作列上所有正在執行的程式名稱 ? PartⅡ |
尚未結案
|
jaya
初階會員 發表:9 回覆:70 積分:30 註冊:2002-05-22 發送簡訊給我 |
在看到 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 發送簡訊給我 |
如果您要抓到執行檔的名稱步驟挺麻煩的,需要動用到 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 發送簡訊給我 |
|
geniustom
版主 發表:100 回覆:303 積分:260 註冊:2003-01-03 發送簡訊給我 |
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"> =程式是一種藝術 也是訓練自己的分析規劃=
=是段落分明 或是雜亂無章=
=是一言以敝 或是廢話連篇=
=是一目了然 或是艱深難懂=
體會這份藝術 您會了解另一份喜悅與成就
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |