原创 Program Name、Process ID、Window Handle、Process Hand

2009-2-23 16:08 3323 6 4 分类: 软件与OS

网上发现的几个函数,比较实用方便:


Program Name、Process ID、Window Handle、Process Handle 的轉換函式


在關閉或取得其他程式執行狀況時 常會需要用到 ProcessID, Process Handle, Window Handle等
例如
TerminateProcess=> Process Handle
PostMessage,SendMessage=> Window Handle

以下是一些它們之間的轉換函式

宣告:

// Get ProcessID By ProgramName (Include Path or Not Include)
function GetPIDByProgramName(const APName: string): THandle;
// Get Window Handle By ProgramName (Include Path or Not Include)
function GetHWndByProgramName(const APName: string): THandle;
// Get Window Handle By ProcessID
function GetHWndByPID(const hPID: THandle): THandle;
// Get ProcessID By Window Handle
function GetPIDByHWnd(const hWnd: THandle): THandle;
// Get Process Handle By Window Handle
function GetProcessHndByHWnd(const hWnd: THandle): THandle;
// Get Process Handle By Process ID
function GetProcessHndByPID(const hAPID: THandle): THandle;




實作:


// Get Window Handle By ProgramName (Include Path or Not Include)
function GetHWndByProgramName(const APName: string): THandle;
begin
    Result:=GetHWndByPID(GetPIDByProgramName(APName));
end;

// Get Process Handle By Window Handle
function GetProcessHndByHWnd(const hWnd: THandle): THandle;
var
    PID: DWORD;
    AhProcess: THandle;
begin
    if hWnd<>0 then
    begin
    GetWindowThreadProcessID(hWnd, @PID);
    AhProcess := OpenProcess(PROCESS_ALL_ACCESS, false, PID);
    Result:=AhProcess;
    CloseHandle(AhProcess);
    end
    else
    Result:=0;
end;

// Get Process Handle By Process ID
function GetProcessHndByPID(const hAPID: THandle): THandle;
var
    AhProcess: THandle;
begin
    if hAPID<>0 then
    begin
    AhProcess := OpenProcess(PROCESS_ALL_ACCESS, false, hAPID);
    Result:=AhProcess;
    CloseHandle(AhProcess);
    end
    else
    Result:=0;
end;


// Get Window Handle By ProcessID
function GetPIDByHWnd(const hWnd: THandle): THandle;
var
    PID: DWORD;
begin
    if hWnd<>0 then
    begin
    GetWindowThreadProcessID(hWnd, @PID);
    Result:=PID;
    end
    else
    Result:=0;
end;


// Get Window Handle By ProcessID
function GetHWndByPID(const hPID: THandle): THandle;
type
    PEnumInfo = ^TEnumInfo;
    TEnumInfo = record
    ProcessID: DWORD;
    HWND: THandle;
    end;

    function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
    var
    PID: DWORD;
    begin
    GetWindowThreadProcessID(Wnd, @PID);
    Result := (PID <> EI.ProcessID) or
        (not IsWindowVisible(WND)) or
        (not IsWindowEnabled(WND));

    if not Result then EI.HWND := WND; //break on return FALSE 所以要反向檢查
    end;

    function FindMainWindow(PID: DWORD): DWORD;
    var
    EI: TEnumInfo;
    begin
    EI.ProcessID := PID;
    EI.HWND := 0;
    EnumWindows(@EnumWindowsProc, Integer(@EI));
    Result := EI.HWND;
    end;
begin
    if hPID<>0 then
    Result:=FindMainWindow(hPID)
    else
    Result:=0;
end;


// Get ProcessID By ProgramName (Include Path or Not Include)
function GetPIDByProgramName(const APName: string): THandle;
var
    isFound: boolean;
    AHandle, AhProcess: THandle;
    ProcessEntry32: TProcessEntry32;
    APath: array[0..MAX_PATH] of char;
begin
    try
    Result := 0;
    AHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    ProcessEntry32.dwSize := Sizeof(ProcessEntry32);
    isFound := Process32First(AHandle, ProcessEntry32);

    while isFound do
    begin
        AhProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
        false, ProcessEntry32.th32ProcessID);
        GetModuleFileNameEx(AhProcess, 0, @APath[0], sizeof(APath));

        if (UpperCase(StrPas(APath)) = UpperCase(APName)) or
        (UpperCase(StrPas(ProcessEntry32.szExeFile)) = UpperCase(APName)) then
        begin
        Result := ProcessEntry32.th32ProcessID;
        break;
        end;
        isFound := Process32Next(AHandle, ProcessEntry32);
        CloseHandle(AhProcess);
    end;
    finally
    CloseHandle(AHandle);
    end;
end;


转自:http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=61654

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条