通過程序號ID獲得視窗的控制代碼

2021-06-22 04:04:24 字數 4327 閱讀 8751

2023年-09月-05日

通過程序號的id獲得視窗的控制代碼

最近幾天,工作的需要,打算實現將別人編譯好的exe程式,通過自己的程式去呼叫,然後根據程式中得到的id號,去得到此程序執行建立的視窗控制代碼,在網上搜了一段時間,得到了不少啟示,再結合自己的實際環境,整合出了以下三種方法,以下將針對每一種方法做出簡單的介紹同時給出關鍵**,本人所採用的平台為vc6.0,英文企業版。

在介紹方法之前,首先需要介紹下,在自己的程式中執行編譯好的exe方法,網上搜蒐會得到不少啟示,主要就是三個api函式(winexec,shellexecute ,createprocess,可以實現呼叫其他程式的要求,其中以winexec最為簡單,shellexecute比winexec靈活一些,createprocess最為複雜。)   本人在實際的開發環境中採用的是createprocess方法,至於該方法各引數的詳細說明與使用,請參考msdn上的講解。以下是我執行exe的**。

[cpp]view plain

copy

print?

[cpp]view plain

copy

print

?startupinfo si;  

//啟動程序引數

process_information pi;  

//程序資訊結構

lpstr

filename=sprocessname.getbuffer(0); 

//全路徑

//結構清零

zeromemory(&si,

sizeof

(si));  

//此引數必須清零

zeromemory(&pi,

sizeof

(pi));  

//此引數必須清零

si.dwflags =startf_useshowwindow;

//隱藏建立的視窗

si.wshowwindow=sw_hide;

//隱藏建立的視窗

//建立程序

bool

flag=createprocess(  

filename,  

//建立的程序,

null,  

null,  

null,  

false

,  0,  

null,  

null,  

&si,  

&pi);  

if(flag==0)  

//等待程序,直到其退出。

waitforsingleobject(pi.hprocess,infinite);  

//關閉控制代碼

bool

flag1=closehandle(pi.hthread );  

bool

flag2=closehandle(pi.hprocess );  

startupinfo si;  //啟動程序引數

process_information pi; //程序資訊結構

lpstr filename=sprocessname.getbuffer(0); //全路徑

//結構清零

zeromemory(&si,sizeof(si)); //此引數必須清零

zeromemory(&pi,sizeof(pi)); //此引數必須清零

si.dwflags =startf_useshowwindow;//隱藏建立的視窗

si.wshowwindow=sw_hide;//隱藏建立的視窗

//建立程序

bool flag=createprocess(

filename, //建立的程序,

null,

null,

null,

false,

0,null,

null,

&si,

&pi);

if(flag==0)

//等待程序,直到其退出。

waitforsingleobject(pi.hprocess,infinite);

//關閉控制代碼

bool flag1=closehandle(pi.hthread );

bool flag2=closehandle(pi.hprocess );

[html]view plain

copy

print?

根據得到的pi結構,可以得到執行的exe的程序號。  

法:  

根據得到的pi結構,可以得到執行的exe的程序號。

第一種方法:

利用findwindow()api函式,此函式宣告為:

[html]view plain

copy

print?

hwnd findwindow(  

lpctstr lpclassname,  // class name  

lpctstr lpwindowname  // window name  

);  

hwnd findwindow(

lpctstr lpclassname, // class name

lpctstr lpwindowname // window name

);

使用該api前提,是需要知道建立視窗的類名或者視窗的標題,一般來說,視窗的類名師不容易得到,一般用的引數是視窗的標題。此函式返回值就是視窗的控制代碼。此方法比較簡單,這裡不再贅述。

第二種方法:

利用enumwindows與getwindowthreadprocessid 這兩個api函式。具體實現的**如下:

[cpp]view plain

copy

print?

typedef

struct enumfunarg  

enumfunarg,*lpenumfunarg;  

bool callback lpenumfunc(hwnd hwnd, lparam lparam)  

return false;     

}hwnd returnwnd(dword processid)  

return retwnd;  

}  

typedef struct enumfunarg

enumfunarg,*lpenumfunarg;

bool callback lpenumfunc(hwnd hwnd, lparam lparam)

return false;

}hwnd returnwnd(dword processid)

return retwnd;

}

將此部分**新增到程式中,直接呼叫相關的函式,就能得到視窗的控制代碼。

第三種方法:

利用guithreadinfo以及getguithreadinfo。具體的**如下:

[cpp]view plain

copy

print?

#include 

#include 

#include 

hwnd g_hwnd=null;  

guithreadinfo gui;  

waitforinputidle(pi.hprocess,infinite);  

fillmemory(&gui,sizeof(guithreadinfo),0);  

gui.cbsize=sizeof(guithreadinfo);   

if (getguithreadinfo(pi.dwthreadid,&gui))  

}  

#include #include #include hwnd g_hwnd=null;

guithreadinfo gui;

waitforinputidle(pi.hprocess,infinite);

fillmemory(&gui,sizeof(guithreadinfo),0);

gui.cbsize=sizeof(guithreadinfo);

if (getguithreadinfo(pi.dwthreadid,&gui))

}

第三種方法相對來講比較簡單一些,但編譯時一定要注意,三個標頭檔案,不能少。

通過程序號ID獲得視窗的控制代碼

通過程序號的id獲得視窗的控制代碼 最近幾天,工作的需要,打算實現將別人編譯好的exe程式,通過自己的程式去呼叫,然後根據程式中得到的id號,去得到此程序執行建立的視窗控制代碼,在網上搜了一段時間,得到了不少啟示,再結合自己的實際環境,整合出了以下三種方法,以下將針對每一種方法做出簡單的介紹同時給出...

視窗控制代碼,程序ID,程序控制代碼,視窗與程序之間的關係

在windows或linux等作業系統下視窗控制代碼對應著每個視窗的鑰匙,例如,你要對某乙個視窗進行操作,你必須知道你要操作哪乙個視窗,這裡就拿windows做舉例,windows下幾乎會建立許許多多個視窗,但是我們怎麼知道我們操作的是哪個視窗?答 就是視窗控制代碼,每個視窗在被建立出來之後就會被賦...

如何根據程序id獲取該程序的主視窗控制代碼

最近剛好有個功能,需要這個邏輯,話不多說,上 struct handle data bool ismainwindow hwnd handle hwnd findmainwindow unsigned long process id bool callback enumwindowscallback...