﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-农妇，山泉，有点儿田-随笔分类-Windows</title><link>http://www.cppblog.com/deadpunk/category/15698.html</link><description>我没有技术</description><language>zh-cn</language><lastBuildDate>Thu, 16 Dec 2010 06:18:38 GMT</lastBuildDate><pubDate>Thu, 16 Dec 2010 06:18:38 GMT</pubDate><ttl>60</ttl><item><title>转载: 获取Console Window的窗口句柄的三种方法</title><link>http://www.cppblog.com/deadpunk/archive/2010/12/16/136622.html</link><dc:creator>活着就是折腾，所以当然要骠悍的折腾</dc:creator><author>活着就是折腾，所以当然要骠悍的折腾</author><pubDate>Thu, 16 Dec 2010 05:54:00 GMT</pubDate><guid>http://www.cppblog.com/deadpunk/archive/2010/12/16/136622.html</guid><wfw:comment>http://www.cppblog.com/deadpunk/comments/136622.html</wfw:comment><comments>http://www.cppblog.com/deadpunk/archive/2010/12/16/136622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deadpunk/comments/commentRss/136622.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deadpunk/services/trackbacks/136622.html</trackback:ping><description><![CDATA[<font  color="#333333" face="Arial"><span  style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><p style="line-height: normal; ">——————— 【 转载请保留 】 ———————</p><p style="line-height: normal; ">作者：Defanive<br style="line-height: normal; ">博客：Console.Dec.Cn（Hi.Baidu.Com/Console_App）</p><p style="line-height: normal; ">——————— 【 谢谢合作 】 ———————</p><p style="line-height: normal; ">类型：原创<br style="line-height: normal; ">时间：09.03.21<br style="line-height: normal; ">测试环境：VC++ 6.0</p><p style="line-height: normal; ">窗口，都有其唯一的句柄（hWnd）。得到了窗口句柄，能够做很多事情。控制台程序，若能在窗口效果上下文章，那么这个第三方工具将会很成功。</p><p style="line-height: normal; ">网上给出的常用方法：</p><p style="line-height: normal; ">HWND hw=FindWindow("ConsoleWindowClass",NULL);</p><p style="line-height: normal; ">这不失为一个好方法，但是单从Class方面入手保险度不高。</p><p style="line-height: normal; ">API函数FindWindow有两个参数，类名与窗口标题。当不提供窗口标题的时候，返回的句柄为同类窗口中Z序最高的窗口句柄。虽然说执行只是一瞬间，但是保险起见，还是提供下标题窗口，更保险。</p><p style="line-height: normal; ">char strTitle[255];<br style="line-height: normal; ">GetConsoleTitle(strTitle, 255);<br style="line-height: normal; ">HWND hw=FindWindow("ConsoleWindowClass",strTitle);</p><p style="line-height: normal; ">当然，如果要精益求精，还有更保险的办法，用 Kernel32.dll 中部分未公布的API。在用 eXeScope 导出 Kernel32.dll 中控制台相关的API之后，发现有一个名为GetConsoleWindow的API。查找参考了部分资料后，提供如下代码，能够动态载入这个API并获得窗口句柄。</p><p style="line-height: normal; ">首先需要全局声明：</p><p style="line-height: normal; ">typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)();<br style="line-height: normal; ">PROCGETCONSOLEWINDOW GetConsoleWindow;</p><p style="line-height: normal; ">然后再Main()函数开头中输入以下内容：</p><p style="line-height: normal; ">HMODULE hKernel32 = GetModuleHandle("kernel32");<br style="line-height: normal; ">GetConsoleWindow = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");</p><p style="line-height: normal; ">完成了动态载入API函数GetConsoleWindow的任务。需要使用时可如下：</p><p style="line-height: normal; ">HWND cmd=GetConsoleWindow();</p><p style="line-height: normal; ">个人认为，使用API函数GetConsoleWindow是最安全，也是最好的方法。在更大的控制台编程中，可能随时需要用到AttachConsole来改变程序的宿主控制台，这个时候再用前两种方法就不够好了。尽管载入的代码很长，但是通用性更高。</p><p style="line-height: normal; "><strong style="line-height: normal; ">范例下载地址：<br style="line-height: normal; "></strong><a href="http://www.qupan.com/down/defanive_3030830.html" style="color: rgb(20, 141, 214); line-height: normal; text-decoration: none; "><strong style="line-height: normal; ">http://www.qupan.com/down/defanive_3030830.html</strong></a></p><p style="line-height: normal; ">——————— 【 转载请保留 】 ———————</p><p style="line-height: normal; ">作者：Defanive<br style="line-height: normal; ">博客：Console.Dec.Cn（Hi.Baidu.Com/Console_App）</p><p style="line-height: normal; ">——————— 【 谢谢合作 】 ———————</p></span></font><img src ="http://www.cppblog.com/deadpunk/aggbug/136622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deadpunk/" target="_blank">活着就是折腾，所以当然要骠悍的折腾</a> 2010-12-16 13:54 <a href="http://www.cppblog.com/deadpunk/archive/2010/12/16/136622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>