得到控制台窗口的句柄

摘要:
获取控制台窗口的句柄并调用GetConsoleTitle()保存当前控制台窗口标题。调用FindWindow(NULL)以恢复原始窗口标题,检索SetConsoleTitle()的值。您可以测试返回的HWND是否与调用HWND上的GetWindowText()的当前进程相对应,并将结果与GetConsoleTitle()进行比较。结果HWND不一定适用于所有窗口句柄操作。

得到控制台窗口的句柄

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

搜索

复制

免责声明:文章转载自《得到控制台窗口的句柄》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇前端工程中使用require.context实现前端工程自动化,批量导入路由表、批量导入svg图等场景,g_signal_connect 与 g_signal_connect_swapped下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

EFCore数据库迁移命令整理

因为现在用.net core 开发新项目,过程中需要经常涉及到数据命令的迁移,今天分别整EFCore 的两种迁移数据库的方式  1 程序包管理器控制台 , Package Manager Console(PMC)        -如果你用visual studio 开发建议使用PMC迁移方式,该方式是同时支持efcore和原先的ef 迁移的 2 命令行工具...

C#调用Win32 的API函数User32.dll

转自:http://www.cnblogs.com/gaoweipeng Win32的API函数是微软自己的东西,可以直接在C#中直接调用,在做WinForm时还是很有帮助的。有时候我们之直接调用Win32 的API,可以很高效的实现想要的效果。 代码 using System;using System.Collections.Generic;using...

C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出

C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出,这里使用到了Windows API SetConsoleCtrlHandler函数 注意:在VS中调试执行时,在处理程序例程中设置断点,不会中断;会提示:无可用源,如下图: 完整示例代码:   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17...

fread写入结构体

#include<stdio.h> #include <stdlib.h> #define N 4 typedef struct student_type { char name[10]; int num; int score; }student_type; int main() { student_type temp;...

union 中null值合并原理

正常情况下null<>null 的,但是在union中如果有两个null值,那么只会显示一个。 1.null<>null  下例中可以看出null<>null SQL>  select * from dual; DU--X SQL> select * from dual where null=null; 未选...

php CI框架目录结构及运行机制

CI目录结构   CI主要组成部分为,application(应用文件夹)、system(系统文件夹)和index.php入口文件。     应用文件夹中主要是存放控制器、模型和视图等,系统文件夹中主要是存放组成CI的核心文件的,index.php入口文件是一个单一入口文件,所谓单一文 件是指在一个网站(应用程序)中,所有的请求都是指向的这么一个文件,由...