測試環境:vc++ 6.0
在windows中,控制代碼是乙個系統內部資料結構的引用。例如當你操作乙個視窗,或說是乙個delphi窗體時,系統會給你乙個該視窗的控制代碼,系統會通知你:你正在操作142號視窗,就此你的應用程式就能要求系統對142號視窗進行操作——移動視窗、改變視窗大小、把視窗極小化為圖示等。實際上許多windows api函式把控制代碼作為它的第乙個引數,如gdi(圖形裝置介面)控制代碼、選單控制代碼、例項控制代碼、位圖控制代碼等,不僅僅侷限於視窗函式。換句話說,控制代碼是一種內部**,通過它能引用受系統控制的特殊元素,如視窗、位圖、圖示、記憶體塊、游標、字型、選單等。控制台程式也有視窗控制代碼,並且他可以操作其他程式的視窗控制代碼。
常用方法:
hwnd hw=findwindow("consolewindowclass",null);
這不失為乙個好方法,但是單從class方面入手保險度不高。
api函式findwindow有兩個引數,類名與視窗標題。當不提供視窗標題的時候,返回的控制代碼為同類視窗中z序最高的視窗控制代碼。雖然說執行只是一瞬間,但是保險起見,還是提供下標題視窗,更保險。
char strtitle[255];
getconsoletitle(strtitle, 255);
hwnd hw=findwindow("consolewindowclass",strtitle);
當然,如果要精益求精,還有更保險的辦法,用 kernel32.dll 中部分未公布的api。在用 exescope 匯出 kernel32.dll 中控制台相關的api之後,發現有乙個名為getconsolewindow的api。查詢參考了部分資料後,提供如下**,能夠動態載入這個api並獲得視窗控制代碼。
首先需要全域性宣告:
typedef hwnd (winapi *procgetconsolewindow)();
procgetconsolewindow getconsolewindow;
然後再main()函式開頭中輸入以下內容:
hmodule hkernel32 = getmodulehandle("kernel32");
getconsolewindow = (procgetconsolewindow)getprocaddress(hkernel32,"getconsolewindow");
完成了動態載入api函式getconsolewindow的任務。需要使用時可如下:
hwnd cmd=getconsolewindow();
個人認為,使用api函式getconsolewindow是最安全,也是最好的方法。在更大的控制台程式設計中,可能隨時需要用到attachconsole來改變程式的宿主控制台,這個時候再用前兩種方法就不夠好了。儘管載入的**很長,但是通用性更高。
360雲盤
——————— 【 謝謝合作 】 ———————
獲取控制台視窗的控制代碼(hWnd)
謝謝合作 測試環境 vc 6.0 視窗,都有其唯一的控制代碼 hwnd 得到了視窗控制代碼,能夠做很多事情。控制台程式,若能在視窗效果上下文章,那麼這個第三方工具將會很成功。網上給出的常用方法 hwnd hw findwindow consolewindowclass null 這不失為乙個好方法,...
得到控制台視窗的控制代碼
呼叫 getconsoletitle 來儲存當前的控制台視窗標題。呼叫 setconsoletitle 來將控制台標題更改為乙個唯一的標題。呼叫 sleep 40 以確保已更新視窗標題。呼叫 findwindow null,uniquetitle 以獲取 hwnd,此呼叫將返回 hwnd,如果操作失...
得到控制台視窗的控制代碼
呼叫 getconsoletitle 來儲存當前的控制台視窗標題。呼叫 setconsoletitle 來將控制台標題更改為乙個唯一的標題。呼叫 sleep 40 以確保已更新視窗標題。呼叫 findwindow null,uniquetitle 以獲取 hwnd,此呼叫將返回 hwnd,如果操作失...