获取控制台窗口的句柄

 

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

你可能感兴趣的:(Console,编程)