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



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

  1. 获取WPF窗体/控件的句柄/当前进程的句柄

    1.在WPF中,获取当前窗体的句柄与WINFORM中不一样: WINFORM直接获取:this.Handle----------this是窗体的类名,handle就是句柄. 2.WPF中先引用命名空间 ...

  2. VC 获取任务栏窗体的句柄

     本文将介绍一个未公开的Win32 API函数:GetTaskmanWindow.利用它对Windows的任务栏进行操作. 这个函数返回拥有任务栏button的窗体句柄. 在微软的MSDN文档中. ...

  3. MFC获取各个窗体(体)之间的指针(对象)

    MFC在非常多的对话框操作中,我们常常要用到在一个对话框中调用还有一个对话框的函数或变量.能够用例如以下方法来解决.    HWND hWnd=::FindWindow(NULL,_T("S ...

  4. WindowFromPoint -- 获得包括指定点的窗体的句柄

     WindowFromPoint 函数功能: 该函数获得包括指定点的窗体的句柄. 函数原型: HWND WindowFromPoint(POINT Point): 參数: Point:指定一个被检 ...

  5. MFC获取各窗口指针句柄

    MFC在很多的对话框操作中,我们经常要用到在一个对话框中调用另一个对话框的函数或变量.可以用如下方法来解决.   HWND hWnd=::FindWindow(NULL,_T("Sphere ...

  6. VC 获取指定文件夹路径的方法小结

    VC获取指定文件夹路径 flyfish  2010-3-5 一 使用Shell函数 1 获取应用程序的安装路径 TCHAR buf[_MAX_PATH];SHGetSpecialFolderPath( ...

  7. 如何用SPY++工具查看窗体的句柄

    我安装的是vs2012,先找到SPY++工具打开 打开方式: 方式1:通过路径(C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microso ...

  8. VC获取屏幕分辨率及大小相关(转)

    vc得到屏幕的当前分辨率方法: 1.Windows API调用 int width = GetSystemMetrics ( SM_CXSCREEN );  int height= GetSystem ...

  9. C语言控制台窗体图形界面编程(八):鼠标事件

           上次讲的是键盘事件,这次我们介绍鼠标事件. 以下先介绍下鼠标事件的结构体以及相关信息. typedef struct _MOUSE_EVENT_RECORD //鼠标事件结构体 { CO ...

随机推荐

  1. Swift - 将Data数据转换为[UInt8](bytes字节数组)

    有时上传或者发送图片.文字时,需要将数据转换为 bytes 字节数组.下面介绍两种将 Data 转换为 [UInt8] 的方法. 假设我们有如下 Data 数据要转换: 1 let data = &q ...

  2. nRF52832添加微信硬件接入服务AirSync

    开发环境 SDK版本:nRF5_SDK_15.0.0 芯片:nRF52832-QFAA OS: FreeRTOS 10.0.0 测试APP:AirSyncDebugger  https://iot.w ...

  3. C#调用SMS短信接口,轻松搞定发送短信的任务。。。。

    首先我们需要去这里http://sms.webchinese.cn/申请一个账号和短信接口秘钥,在该网址下有许多语言的demo介绍,下面我主要为大家贴一个C#中的Helper类: using Syst ...

  4. 使用纯 CSS 实现 Google Photos 照片列表布局

    文章太长,因为介绍了如何一步一步进化到最后接近完美的效果的,不想读的同学可以直接跳到最后一个大标题之后看代码.demo及原理就好,或者也可以直接看下面这个链接的源代码. 不过还是建议顺序读下去,因为后 ...

  5. parseint和isNaN用法

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. jQuery访问json文件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. <转>统计源代码行数的一些实现方法

    这个问题的思考其实对于某一种语言而言,基本都能实现,只是简单和复杂而已.而此次我讨论就是只是在linux下面使用了shell和c对源代码进行行 数的讨论.本打算是实现一个python版本的,由于pyt ...

  8. PhotoZoom Pro 7怎么进行参数设置

    每个用户在使用PhotoZoom时,在针对不同的图片,我们处理的方式也不同.所以在参数设置会因图片不同而不同.那么在PhotoZoom中参数究竟如何设置呢? 首先,我们先打开[参数设置],点击后会弹出 ...

  9. JS中的map

    定义和用法: map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值. map() 方法按照原始数组元素顺序依次处理元素. 注意: map() 不会对空数组进行检测. 注意: m ...

  10. MooFest 树状数组 + 前缀和

    比较友好的数据结构题 建议读者好好思考思考--. 可以分析出与前缀和的关系, 之后就愉快的套起树状数组辣 #include <cstdio> #include<queue> # ...