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

請問我如何從已知Handle得到Application的FileName

答題得分者是:change.jian
max5020
資深會員


發表:26
回覆:277
積分:320
註冊:2003-06-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-11-28 19:47:00 IP:59.120.xxx.xxx 未訂閱
就是工作管理員 - 處理程序 - "影像名稱" 這欄??
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-11-29 09:30:55 IP:147.8.xxx.xxx 未訂閱
Win32 API: GetModuleFileName
max5020
資深會員


發表:26
回覆:277
積分:320
註冊:2003-06-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-11-29 11:02:12 IP:59.120.xxx.xxx 未訂閱
我是延續之前的問題GetForegroundWindow
取到的該Handle之後,
用GetWindowText,
已經能取到資料,
但是用GetModuleFileName,
還是取不到FileName!!
怎麼辦??

max5020
資深會員


發表:26
回覆:277
積分:320
註冊:2003-06-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-11-30 17:11:41 IP:59.120.xxx.xxx 未訂閱
我在MSDN找到這個東東,
可不可以請那位大大,
幫忙改寫改Delphi,
謝謝!!
BOOL GetFileNameFromHandle(HANDLE hFile)
{
BOOL bSuccess = FALSE;
TCHAR pszFilename[MAX_PATH 1];
HANDLE hFileMap;
// Get the file size.
DWORD dwFileSizeHi = 0;
DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi);
if( dwFileSizeLo == 0 && dwFileSizeHi == 0 )
{
printf("Cannot map a file with a length of zero.\n");
return FALSE;
}
// Create a file mapping object.
hFileMap = CreateFileMapping(hFile,
NULL,
PAGE_READONLY,
0,
1,
NULL);
if (hFileMap)
{
// Create a file mapping to get the file name.
void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);
if (pMem)
{
if (GetMappedFileName (GetCurrentProcess(),
pMem,
pszFilename,
MAX_PATH))
{
// Translate path with device name to drive letters.
TCHAR szTemp[MAX_PATH];
szTemp[0] = '\0';
if (GetLogicalDriveStrings(MAX_PATH-1, szTemp))
{
TCHAR szName[MAX_PATH];
TCHAR szDrive[3] = TEXT(" :");
BOOL bFound = FALSE;
TCHAR* p = szTemp;
do
{
// Copy the drive letter to the template string
*szDrive = *p;
// Look up each device name
if (QueryDosDevice(szDrive, szName, MAX_PATH))
{
UINT uNameLen = _tcslen(szName);
if (uNameLen < MAX_PATH)
{
bFound = _tcsnicmp(pszFilename, szName,
uNameLen) == 0;
if (bFound)
{
// Reconstruct pszFilename using szTemp
// Replace device path with DOS path
TCHAR szTempFile[MAX_PATH];
_stprintf(szTempFile,
TEXT("%s%s"),
szDrive,
pszFilename uNameLen);
_tcsncpy(pszFilename, szTempFile, MAX_PATH);
}
}
}
// Go to the next NULL character.
while (*p );
} while (!bFound && *p); // end of string
}
}
bSuccess = TRUE;
UnmapViewOfFile(pMem);
}
CloseHandle(hFileMap);
}
printf("File name is %s\n", pszFilename);
return(bSuccess);
}
change.jian
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-12-06 13:14:49 IP:211.23.xxx.xxx 未訂閱
1.那個東西要從系統的 Snapshot 來取得(os會有一個類似"catch"的東西,記錄目前有那些 Process 在執行)
2.Delphi 裡有個 TlHelp32 的 unit,uses 他,裡面會有你需要的 API
3.利用 google 之類的,搜尋 "CreateToolhelp32Snapshot" ,你應可以得到不少資料
4.在 Delphi4 業界標準手冊 (Borland Delphi 4 Developer's Guid) 的第14章裡有完整的說明
max5020
資深會員


發表:26
回覆:277
積分:320
註冊:2003-06-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-12-06 17:13:56 IP:59.120.xxx.xxx 未訂閱
首先感謝各位先進的指導,
我目前使用GetForegroundWindow,
取到Handle之後,
由該Handle, 可以正確的取得GetWindowText,
但是一直無法取到該Handle的FileName,
參考了CreateToolhelp32Snapshot, Process32First, Process32Next,
確實可以取得所有執行中Application的FileName,
但是依然沒辦法取到GetForegroundWindow.Handle的FileName,
目前看來由GetForegroundWindow取得Handle,
並無法對慼到該Application的FileName,
請問是否還有其他方向, 讓我參考呢??
感激不盡!!!
change.jian
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2006-12-07 13:00:22 IP:211.23.xxx.xxx 未訂閱
得到 window handle 後,透過 GetWindowThreadProcessId ,可以得到相關的 ProcessID 及 ThreadID
然後,再輔以 CreateToolhelp32Snapshot ,就可以找到你要的東西了

===================引 用 文 章===================
首先感謝各位先進的指導,
我目前使用GetForegroundWindow,
取到Handle之後,
由該Handle, 可以正確的取得GetWindowText,
但是一直無法取到該Handle的FileName,
參考了CreateToolhelp32Snapshot, Process32First, Process32Next,
確實可以取得所有執行中Application的FileName,
但是依然沒辦法取到GetForegroundWindow.Handle的FileName,
目前看來由GetForegroundWindow取得Handle,
並無法對慼到該Application的FileName,
請問是否還有其他方向, 讓我參考呢??
感激不盡!!!
max5020
資深會員


發表:26
回覆:277
積分:320
註冊:2003-06-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2006-12-07 15:01:09 IP:59.120.xxx.xxx 未訂閱
小弟功力不夠,
還是未能弄出來,
有請各位先進幫忙了!!
(ps.目前我是在Timer內取GetForegroundWindow的)
japhen
中階會員


發表:2
回覆:57
積分:71
註冊:2006-08-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-01-11 11:52:57 IP:125.229.xxx.xxx 訂閱
A、抓自己的檔名用 Application.exename
B、抓別的程式窗口的HANDLE,索取該程式的檔

1、先在uses加入psAPI單元
2、加入這個函數
function GetWindowFileName(hWindowHandle:HWND):String;
var
hprocessID: INTEGER;
processHandle: THandle;
DWResult: DWORD;
xname: array[0..254] of char ;
begin
if isWindow(hWindowHandle) then
begin
{ 利用window的handle抓進程id (processid) }
GetWindowThreadProcessID(hWindowHandle, @hprocessID);
if hprocessID <> 0 then
begin
{ 這個進程存在的話,抓這個進程的handle(和window handle是不同的東西) }
processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,
False, hprocessID);
if processHandle <> 0 then
begin
fillchar(xname,255,#0);
GetModuleFileNameEx(hprocessID,0,xname,255);
result:=xname;
CloseHandle(ProcessHandle); // 記得釋放被我臨時調用的handle
end;
end;
end;
end;
3、檔名到手了!

------
歡迎在大陸的台商加入我們的行列
台商小棧 www.twgocn.com
系統時間:2024-03-29 13:30:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!