1. 调用 GetConsoleTitle() 来保存当前的控制台窗口标题。
  2. 调用 SetConsoleTitle() 来将控制台标题更改为一个唯一的标题。
  3. 调用 Sleep(40),以确保已更新窗口标题。
  4. 调用 FindWindow(NULL, uniquetitle),以获取 HWND,此调用将返回 HWND, 如果操作失败,将返回 NULL。
  5. 从步骤 1 中,若要恢复原始窗口标题检索调用 SetConsoleTitle() 的值。

您应该测试结果的 HWND。例如,您可以测试是否返回的 HWND 对应于当前进程在 HWND 上调用 GetWindowText() 并将结果与 GetConsoleTitle() 进行比较,请参阅。

结果 HWND 不一定要适用于所有窗口句柄操作。

示例代码

下面的函数中检索当前控制台应用程序窗口句柄 (HWND)。如果此函数成功,则返回值是控制台窗口的句柄。如果此函数失败,则返回值为 NULL。省略一些错误检查,为简洁起见。

   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[MY_BUFSIZE]; // Contains original// WindowTitle.// Fetch current window title.GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);// Format a "unique" NewWindowTitle.wsprintf(pszNewWindowTitle,"%d/%d",GetTickCount(),GetCurrentProcessId());// Change current window title.SetConsoleTitle(pszNewWindowTitle);// Ensure window title has been updated.Sleep(40);// Look for NewWindowTitle.hwndFound=FindWindow(NULL, pszNewWindowTitle);// Restore original window title.SetConsoleTitle(pszOldWindowTitle);return(hwndFound);}

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

转载于:https://www.cnblogs.com/dragon2012/archive/2013/03/18/2965468.html

得到控制台窗口的句柄相关推荐

  1. 获取控制台窗口的句柄(HWND)和程序中输出回车键

    一.获取窗口句柄基于类名或窗口名称: http://support.microsoft.com/kb/124103/zh-cn Win32 API 提供用于获取与一个控制台应用程序相关联的窗口句柄没有 ...

  2. linux上c语言hdc句柄,控制台窗口的绘图

    最近和别人聊天,聊到了控制台绘图,曾经学了一些windows的API编程,却没想到直接在控制台窗口上进行绘图 今天有时间,便把代码写了出来 #include #include /*********** ...

  3. 【C语言】控制台窗口图形界面编程(一)句柄和文本属性

    00. 目录 文章目录 00. 目录 01. 句柄 02. GetStdHandle函数 03. CloseHandle函数 04. SetConsoleTextAttribute函数 05. 十进制 ...

  4. 在C语言中,SetConsoleTextAttribute(参数1,参数2)是设置控制台窗口字体颜色和背景颜色的函数。GetStdHandle(参数)函数用于获得句柄

    在C语言中,SetConsoleTextAttribute(参数1,参数2)是设置控制台窗口字体颜色和背景颜色的函数. 参数1:句柄 参数2:颜色 颜色的参数 数值 颜色 0 黑色 1 深蓝色 2 深 ...

  5. 让Win32窗口程序拥有控制台窗口

    让Win32窗口程序拥有控制台窗口 首先,为什么我们有了普通窗口后还要控制台窗口呢?因为我们可以用它方便的输出调试信息,而且普通玩家看到了也会觉得很高端.如果他会输几条命令,可能他会以为自己就是黑客了 ...

  6. 【C语言】控制台窗口图形界面编程(三)窗口相关设置

    00. 目录 文章目录 00. 目录 01. GetConsoleTitle函数 02. SetConsoleTitle函数 03. SetConsoleScreenBufferSize函数 04. ...

  7. 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区

    00. 目录 文章目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScr ...

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

    控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动.下面我们介绍一个控制文本移动的函数,如下: BOOL ScrollConsoleScreenBuffer(   ...

  9. C语言控制台窗口界面编程:printf格式化显示-修改字符字体、颜色和背景

    环境:cygwin-Linux+GCC PS:windows的cmd下不能实现. 在linux终端中一个ls指令得出的显示结果文件夹.文件以及不同操作权限的文件的显示颜色是不同的,那么这个是如何实现的 ...

  10. Windows核心编程_调用控制台窗口

    在我们进行mfc编程和win32窗口编程时,会发现没有控制台窗口其实有时候很无助的,想展示一个数据,要么msg要么debug,但是往往最熟悉的还是那个黑色的窗口 方法: AllocConsole() ...

最新文章

  1. 1.Socket通信
  2. 乐鑫esp8266模块MicroPython开发板MQTT物联网人工智能最小系统
  3. 关系型数据库 (数据库类型)
  4. IDOCALE常用tcode
  5. 都9012了,这几个公众号你还没关注?
  6. 2017.10.23 硬币购物 失败总结
  7. Android 性能测试——Memory Monitor 工具
  8. Android 属性动画(三)
  9. 如何修改已编译的dll文件
  10. 未知地区的探索与猜想
  11. csdn 问答使用与测评
  12. opencv imwrite()保存图片崩溃
  13. system-config-network
  14. LV4500二维码扫描器对接到安卓访客一体机系统应用-拓展扫描二维码登记访客功能
  15. 边缘人工智能芯片大放异彩
  16. 投资顾问需要什么条件
  17. 编写软件时如何偷工减料
  18. Android 友盟统计集成
  19. TS流格式小白入门解读
  20. 一个让人看了心酸、落泪的故事

热门文章

  1. THUWC2019游记
  2. github 远程仓库操作
  3. 非旋转Treap及可持久化[Merge,Split]
  4. WebService学习之三:spring+cxf整合
  5. FZU 1924——死锁——————【topo判环】
  6. js将数值格式化成金额形式
  7. docker限制容器日志大小
  8. 【Robot Framework】字符串判断,if语句多执行条件,多执行语句
  9. Linux内核基础设施
  10. ActiveMQ的消息存储方式