VC 获取控制台窗口的句柄(hWnd)

在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来改变程序的宿主控制台,这个时候再用前两种方法就不够好了。尽管载入的代码很长,但是通用性更高。



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-04 19:37:17

VC 获取控制台窗口的句柄(hWnd)的相关文章

Spy++获取子窗口的句柄

http://blog.csdn.net/pipisorry/article/details/46559139 问题: 如果要搜索的外部程序的窗口标题比较容易得到[],问题是比较简单的.如果窗口的标题不固定或者根本就没有标题,怎么得到窗口的类呢? Introduction Spy++是微软出品的用来获取Window窗口信息的一个小工具.Spy++中,最常用的一个功能,就是识别窗口.获取当前鼠标位置: 获取位于指定位置的窗口句柄: 获取窗口类别: 获取窗口内容或标题. Spy++ (SPYXX.E

VC/MFC开发中的句柄HWND

Windows开发中,经常会碰到一个常见的字眼HWND,如下 HWND hWnd; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); HWND就是句柄,那么句柄是什么? [句柄定义] 先看Windows下面的定义,如下 DECLARE_HANDLE (HWND)

得到控制台窗口的句柄

得到控制台窗口的句柄 调用 GetConsoleTitle() 来保存当前的控制台窗口标题. 调用 SetConsoleTitle() 来将控制台标题更改为一个唯一的标题. 调用 Sleep(40),以确保已更新窗口标题. 调用 FindWindow(NULL, uniquetitle),以获取 HWND,此调用将返回 HWND, 如果操作失败,将返回 NULL. 从步骤 1 中,若要恢复原始窗口标题检索调用 SetConsoleTitle() 的值. 您应该测试结果的 HWND.例如,您可以测

C语言控制台窗口图形界面编程(二)

下面介绍几个用于控制台窗口操作的API函数,如下: [cpp] view plaincopy //获取控制台窗口信息 GetConsoleScreenBufferInfo(); //获取控制台窗口标题 GetConsoleTitle(); //更改指定缓冲区大小 SetConsoleScreenBufferSize(); //设置控制台窗口标题 SetConsoleTitle(); //设置控制台窗口信息 SetConsoleWindowInfo(); 下面的示例程序用于说明此类函数的使用: [

WinAPI: GetClassName - 获取指定窗口的类名

WinAPI: GetClassName - 获取指定窗口的类名 //声明: GetClassName( hWnd: HWND; {指定窗口句柄} lpClassName: PChar; {缓冲区} nMaxCount: Integer {缓冲区大小} ): Integer; {返回类名大小; 失败返回 0} -------------------------------------------------------------------------------- //测试1: 新建一个工程

VC 获取任务栏窗口的句柄

 本文将介绍一个未公开的Win32 API函数:GetTaskmanWindow,利用它对Windows的任务栏进行操作.这个函数返回拥有任务栏按钮的窗口句柄.在微软的MSDN文档中,对任务栏是这样描述的:"--Windows界面包含一个特殊的应用程序桌面工具栏,叫做任务栏.任务栏可以用于在打开的不同窗口之间进行切换,以及启动新的应用程序--.任务栏包含有开始菜单.任务栏按钮.快捷菜单和状态显示区--".可惜在Win32 API的正式问当中没有能存取任务栏的函数.因此我们必须使用未

初识句柄操作(控制台窗口小实验)

今日学习了控制台使用句柄操作的方法. 我们都知道,使用iostream也可以向屏幕中输出语句. 但它们只能实现基本的输入输出 操作,对于控制台窗口界面的控制却无能为力,而且不能与stdio.h和conio.h友好相处,因为iostream和它们是C++两套不同的输入. 因此,我们需要句柄类来帮助我们完成这个操作. 下面直接上练习小代码,为贪食蛇清屏的小片段. 经一番查找,习得基本用法. 1 void clrscr(void) { 2 //控制台窗口信息类型 存有缓冲区大小 当前光标位置 窗口显示

获取窗口实例句柄

方法一 GetWindowLong(hwnd, GWL_HINSTANCE); 获取该窗口句柄做用的实例句柄? 方法二 WM_CREATE? lpcs = (LPCREATESTRUCT) lParam; lpcs->hInstance;获取窗口实例句柄,布布扣,bubuko.com

VC获得控制台HWND GetConsoleHwnd

HWND GetConsoleHwnd(void) { #define MY_BUFSIZE 1024 // Buffer size for console window titles. HWND hwndFound; // This is what is returned to the caller. char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated // WindowTitle. char pszOldWindowTitle