1. 程式人生 > >獲取控制檯視窗的控制代碼(hWnd)

獲取控制檯視窗的控制代碼(hWnd)

作者:Defanive
部落格:Console.Dec.Cn(Hi.Baidu.Com/Console_App)

——————— 【 謝謝合作 】 ———————

測試環境:VC++ 6.0

視窗,都有其唯一的控制代碼(hWnd)。得到了視窗控制代碼,能夠做很多事情。控制檯程式,若能在視窗效果上下文章,那麼這個第三方工具將會很成功。

網上給出的常用方法:

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來改變程式的宿主控制檯,這個時候再用前兩種方法就不夠好了。儘管載入的程式碼很長,但是通用性更高。

相關推薦

獲取控制檯視窗控制hWnd

作者:Defanive 部落格:Console.Dec.Cn(Hi.Baidu.Com/Console_App) ——————— 【 謝謝合作 】 ——————— 測試環境:VC++ 6.0 視窗,都有其唯一的控制代碼(hWnd)。得到了視窗控制代碼,能夠做很多事情。控制

如何獲取控制檯視窗控制 (HWND)

HWND GetConsoleHwnd(void) { #define MY_BUFSIZE 1024 // Buffer size for console window titles. HWND hwndFound; // This is what

得到Java程式的WIN32視窗控制

我們知道C++的每個窗體都對應著一個控制代碼HWND,通過這個控制代碼我們可以對這個視窗以及它的資源進行各種操作,比如讓它前端顯示等。那麼作業系統給Java編寫的窗體(Frame或者JFrame的物件或者子類物件)有沒有分配這個唯一的HWND呢?如果存在的話我們怎麼來在J

C# 根據程序獲取程式主視窗控制包括最小化和隱藏程式

namespace Applications.UI {     class CurrentProcess     {             private static Hashtable processWnd = null;             public del

MFC 獲取當前視窗控制,或者父子視窗控制

父子視窗 在子視窗中,需要用到父視窗的控制代碼: AfxGetMainWnd()->m_hWnd 注:在父視窗中,也可以這麼用來呼叫自己視窗的控制代碼 在子視窗中,需要用到自己視窗的控制代碼 ChildDlg *pChildDlg ; pChildDlg->m_h

獲取ArcMap視窗控制,通過WinAPI獲取工作空間中點選要素的系統桌面座標

這裡用了個“桌面座標”,是希望區分一下ArcGis的“螢幕座標”(與之對應的還有一個“地理座標”)。 什麼是“螢幕座標”呢?使用ITool介面的OnMouseDown方法獲取的“x,y”值即是,其原點值在“工作空間”窗體左上角。 什麼是我所稱謂的“工作空間”呢?它是資料編輯區域,用Spy++檢視一下其窗體

如何查詢窗體,獲取窗體的控制Hwnd FindWindow函式

/*CWnd::FindWindowstatic CWnd* PASCAL FindWindow( LPCTSTR lpszClassName, LPCTSTRlpszWindowNa- me );返回值:標識了具有指定的類名或視窗名的視窗。如果沒有找到這樣的視窗,則返回N

根據程序id獲取視窗控制

struct ProcessWindowData { HWND hWnd; unsigned long lProcessId; }; BOOL CALLBACK EnumWindowCallback(HWND hWnd, LPARAM lParam) { ProcessWindowData&

從父視窗獲取視窗控制以及其例項控制

獲取父視窗控制代碼 HWND hWnddlg = AfxGetMainWnd()->m_hWnd;  //主視窗控制代碼 或者 HWND hWnddlg = this->m_hWnd; //主視窗控制代碼 獲取子視窗控制代碼 如果子視窗是控制元件,並有控制元件

獲取桌面視窗控制

GetDesktopWindow獲取的是頂層顯示桌面控制代碼,也就是說,如果應用程式視窗在桌面上,那麼它的視窗也算是所獲取的視窗的一部分,如果使用GetDC(NULL)作圖,則永遠是在最頂層。 那麼如何獲取包含桌面圖示的視窗控制代碼呢? 我們可以用Spy++來檢視。 可以

.NET物件與Windows控制控制分類和.NET控制洩露的例子

上一篇文章介紹了控制代碼的基本概念,也描述了C#中建立檔案控制代碼的過程。我們已經知道控制代碼代表Windows內部物件,檔案物件就是其中一種,但顯然系統中還有更多其它型別的物件。本文將簡單介紹Windows物件的分類。 控制代碼可以代表的Windows物件分為三類,核心物件(Kernel Object)、

案例——檔案控制pipe增多tomcat模組定位方法

問題描述:tomcat檔案控制代碼數持續增長 定位方法: 定位檔案控制代碼洩漏前需要收集的必要資訊: tomcat初始啟動時的檔案控制代碼數、對tomcat的詳細lsof結果、以及tomcat的記憶體dump; 按時間段對tomcat的檔案控制代碼數進行統計(每小時、

究竟什麼是控制handle

當初學windows程式設計的時候搞不清什麼是控制代碼,有人說其實就是個值,有人說它是個特殊的指標。什麼值?特殊在哪?沒人對我說明白。 今天剛看了《windows程式設計》第三章,由於知識所限,我不敢說看完了就能全面認識什麼是控制代碼,但是,至少明白了它的概念,它在widn

Matlab中的圖形控制轉載

在matlab中,每一個物件都有一個數字來標識,叫做控制代碼.當每次建立一個物件時,matlab就為它建立一個唯一的控制代碼 控制代碼中包含有該物件的相關資訊引數,可以在後續程式中進行操作,改變其中的引數,以便達到不同的效果 例如:gcf 是返回當前被啟用的視窗的控制

GetWindow、GetTopWindow和GetNextWindow視窗控制獲取!!!

GetWindow //uCmd 可選值:   GW_HWNDFIRST = 0; {同級別第一個}   GW_HWNDLAST  = 1; {同級別最後一個}   GW_HWNDNEXT  = 2; {同級別下一個}   GW_HWNDPREV  = 3;

Selenium:多視窗切換獲取視窗控制handle

我們在操作網頁的時候,點選有些頁面的連結,會重新開啟一個視窗,我們要在新頁面上操作,就得切換視窗 比如在百度首頁的登入框點選註冊,會重新開啟一個註冊的新頁面,要在新頁面註冊,就得先切進新頁面 那我們怎麼在這兩個視窗之間進行切換呢?每個瀏覽器視窗都有一個唯一的屬性控制代碼(handle)來表示,我們就可

WPF 視窗控制獲取和設定

WPF 視窗控制代碼設定和獲取 1、控制代碼類 WHwnd.cs public class WHwnd { /// <summary> /// 主窗體控制代碼 /// </summar

按鍵精靈 -獲取視窗控制

MessageBox "視窗右下角座標:" get_window_pos //得到當前最前面的視窗控制代碼-就是把需要的視窗啟用在最前面 Hwnd = Plugin.Window.Foreground() //得到滑鼠指向的視窗控制代碼Hwnd = Plugin.Window.Mo

C#獲取當前活動視窗控制

c# 獲取當前活動視窗控制代碼,獲取視窗大小及位置 2018年04月26日 13:48:21 漂泊_人生 閱讀數:1889   需呼

VC 各種情況下的視窗控制獲取

AfxGetMainWnd AfxGetMainWnd獲取自身視窗控制代碼 HWND hWnd = AfxGetMainWnd()->m_hWnd; GetTopWindow 函式功能:該函式檢查與特定父視窗相聯的子視窗z序(Z序:垂直螢幕的方向,即疊放