得到控制台窗口的句柄
- 调用 GetConsoleTitle() 来保存当前的控制台窗口标题。
- 调用 SetConsoleTitle() 来将控制台标题更改为一个唯一的标题。
- 调用 Sleep(40),以确保已更新窗口标题。
- 调用 FindWindow(NULL, uniquetitle),以获取 HWND,此调用将返回 HWND, 如果操作失败,将返回 NULL。
- 从步骤 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
得到控制台窗口的句柄相关推荐
- 获取控制台窗口的句柄(HWND)和程序中输出回车键
一.获取窗口句柄基于类名或窗口名称: http://support.microsoft.com/kb/124103/zh-cn Win32 API 提供用于获取与一个控制台应用程序相关联的窗口句柄没有 ...
- linux上c语言hdc句柄,控制台窗口的绘图
最近和别人聊天,聊到了控制台绘图,曾经学了一些windows的API编程,却没想到直接在控制台窗口上进行绘图 今天有时间,便把代码写了出来 #include #include /*********** ...
- 【C语言】控制台窗口图形界面编程(一)句柄和文本属性
00. 目录 文章目录 00. 目录 01. 句柄 02. GetStdHandle函数 03. CloseHandle函数 04. SetConsoleTextAttribute函数 05. 十进制 ...
- 在C语言中,SetConsoleTextAttribute(参数1,参数2)是设置控制台窗口字体颜色和背景颜色的函数。GetStdHandle(参数)函数用于获得句柄
在C语言中,SetConsoleTextAttribute(参数1,参数2)是设置控制台窗口字体颜色和背景颜色的函数. 参数1:句柄 参数2:颜色 颜色的参数 数值 颜色 0 黑色 1 深蓝色 2 深 ...
- 让Win32窗口程序拥有控制台窗口
让Win32窗口程序拥有控制台窗口 首先,为什么我们有了普通窗口后还要控制台窗口呢?因为我们可以用它方便的输出调试信息,而且普通玩家看到了也会觉得很高端.如果他会输几条命令,可能他会以为自己就是黑客了 ...
- 【C语言】控制台窗口图形界面编程(三)窗口相关设置
00. 目录 文章目录 00. 目录 01. GetConsoleTitle函数 02. SetConsoleTitle函数 03. SetConsoleScreenBufferSize函数 04. ...
- 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区
00. 目录 文章目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScr ...
- C语言控制台窗口图形界面编程(五).
控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动.下面我们介绍一个控制文本移动的函数,如下: BOOL ScrollConsoleScreenBuffer( ...
- C语言控制台窗口界面编程:printf格式化显示-修改字符字体、颜色和背景
环境:cygwin-Linux+GCC PS:windows的cmd下不能实现. 在linux终端中一个ls指令得出的显示结果文件夹.文件以及不同操作权限的文件的显示颜色是不同的,那么这个是如何实现的 ...
- Windows核心编程_调用控制台窗口
在我们进行mfc编程和win32窗口编程时,会发现没有控制台窗口其实有时候很无助的,想展示一个数据,要么msg要么debug,但是往往最熟悉的还是那个黑色的窗口 方法: AllocConsole() ...
最新文章
- 1.Socket通信
- 乐鑫esp8266模块MicroPython开发板MQTT物联网人工智能最小系统
- 关系型数据库 (数据库类型)
- IDOCALE常用tcode
- 都9012了,这几个公众号你还没关注?
- 2017.10.23 硬币购物 失败总结
- Android 性能测试——Memory Monitor 工具
- Android 属性动画(三)
- 如何修改已编译的dll文件
- 未知地区的探索与猜想
- csdn 问答使用与测评
- opencv imwrite()保存图片崩溃
- system-config-network
- LV4500二维码扫描器对接到安卓访客一体机系统应用-拓展扫描二维码登记访客功能
- 边缘人工智能芯片大放异彩
- 投资顾问需要什么条件
- 编写软件时如何偷工减料
- Android 友盟统计集成
- TS流格式小白入门解读
- 一个让人看了心酸、落泪的故事