该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

如果有认真阅读,相信以上代码一定不难看懂。

【 VC++ 】 获取控制台窗口的句柄(hWnd)

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

打开批处理,唉,左上角的图标还是一个黑黑的框,不免让人感到乏味。万千世界,每个程序运行时的窗体图标都是一个标志,好的标志能让人耳目一新。而命令行程序中,偏偏没有相应的函数能够更改窗体的图标,让人遗憾。经过一段时间的学习,已经掌握了改变命令行窗体图标的方法。本教程将教会你如何在命令行程序中更改窗体图标,让命令行更美观。

首先需要知道SendMessage这个API函数。它的功能很强大,能给窗体发送消息,实现想要的效果。

SendMessage(

HWND hWnd,

UNIT msg,

WPARAM wParam,

LPARAM lParam

)

在本篇教程中,我们要发送的消息,即msg参数,是WM_SETICON消息。字面上理解,就是设置窗体图标。当然,命令行的图标都是小一号的16×16图标,图标的大小只需要在wParam中给上ICON_SMALL参数,就会自动转换。而图标需要用HICON类型作为lParam参数。

获取命令行的hWnd,已经在多篇文章中提到过了,具体请参考:

【 VC++ 】 获取控制台窗口的句柄(hWnd)

那么,现在我们需要从文件中读取出图标,然后放置入HICON类型中,以便SendMessage调用。读取出图标可以用LoadImage这个API函数。

LoadImage(

HINSTANCE,

LPCTSTR,

UNIT,

int,

int,

UNIT

)

第一个参数为程序的实例句柄,我们需要读的是图标文件,因此可以置空。第二个则是图标文件的路径,注意转义符号\,路径中的所有\都得用\\或者/代替。第三个参数指图像类型,IMAGE_ICON常数。第四和第五个参数为图标的大小,全部填0即可。第六个参数为读取方式,LR_LOADFROMFILE常数。当然,这个API函数返回的是HANDLE,我们需要的是HICON,所以还要做强制转换。

示例代码:

从C:\a.ico中读取图标并设置为窗体图标(命令行句柄保存在变量hwnd中)

HICON hIcon;

hIcon=(HICON)LoadImage(NULL,"C:/a.ico",IMAGE_ICON,0,0,LR_LOADFROMFILE);

SendMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)hIcon);

当然,系统中自带了上千个图标,但是这些图标都不是保存在.ico等文件中的,而更多的是保存在.dll或者.exe的资源中。如果能够读取这些资源,就能够使用这些精美的图标了。

读取.dll或者.exe中的资源需要用到ExtractIcon这个API函数。

ExtractIcon(

HINSTANCE hInst,

LPCTSTR lpszExeFileName,

UNIT nIconIndex

)

第一个参数为程序的实例句柄,同样置空即可。第二个参数为文件名,同样需要注意转义符\。第三个参数为资源图标的索引号。

示例代码:

从C:\Windows\System32\NotePad.exe中读取记事本的图标(命令行句柄保存在变量hwnd中)

HICON hIcon;

hIcon=(HICON)ExtractIcon(NULL,"C:/Windows/System32/NotePad.exe",0);

SendMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)hIcon);

现在,命令行窗

vc 控制台添加托盘显示_本教程将教会你如何让控制台程序拥有托盘图标相关推荐

  1. vc 控制台添加托盘显示_开源:ESP8266读DHT11温湿度,小程序实时显示

    第一.原理讲解 原理简述:利用发布订阅模式.第一步,先读取DHT11温湿度数值,第二步,新建主题,然后esp8266往这个主题发送消息,第三步.小程序通过http API接口获取数据.小程序控制原理: ...

  2. vc 控制台添加托盘显示_编程达人

    看到火哥给他的程序加上了系统托盘,我的没有很是不爽.于是花了几分钟找了些资料,给自己的也加上了系统托盘.现在将我的实现步骤分享一下. 先来解释下什么是系统托盘:其实准确的说法应该是任务栏通知区域.系统 ...

  3. vc 控制台添加托盘显示_和硕县塑胶托盘塑料周转筐多少钱、延安塑料物流箱

    他们正是利用了消费者的这种心理,往产品里添加一部分碳酸钙等重物质,不仅仅降低了他们的生成成本也极大的提高了产品自身重量,消费者却被蒙在鼓里.物流与采购联合会托盘专业委员会于2002年9月对北京.天津. ...

  4. vc 控制台添加托盘显示_VC添加托盘图标

    1.define一个消息ID   WM_SHOWTASK用于接收托盘消息 #define WM_SHOWTASK (WM_USER+1000) 2.在窗体初始化处贴下方代码: NOTIFYICONDA ...

  5. VC实现最小化后在系统托盘显示_转http://k1983.blog.sohu.com/47997964.html

    我是照着步骤做的,可以运行 一.NOTIFYICONDATA结构           ----   NOTIFYICONDATA结构包含了系统用来处理托盘图标的信息,它包括选择的图标.回调消息.提示消 ...

  6. java 浏览器访问图片不显示_[Java教程]重新上传图片后 地址不变 浏览器加载不到的问题...

    [Java教程]重新上传图片后 地址不变 浏览器加载不到的问题 0 2016-05-27 07:00:50 做项目的时候遇到一个问题: 上传文件以后,相同的地址,第一次加载没有问题,当你操作次数过快, ...

  7. 怎么更改滚动条的位置php,给网站顶部添加一个滚动条位置百分比教程

    网站顶部添加滚动条显示位置百分比教程,这里以FLY模板进行演示,其他网站大同小异. 这个效果参考joe模板来的.综合说一句,网站初衷为的是用户的体验感,在美化的同时,不要丧失理性,带不动的情况下就不要 ...

  8. 威联通nas怎么更换大硬盘_扩充存储池:威联通NAS添加硬盘的扩容设置教程

    扩充存储池:威联通NAS添加硬盘的扩容设置教程 2020-11-14 14:08:02 38点赞 261收藏 40评论 你是AMD Yes党?还是intel和NVIDIA的忠实簇拥呢?最新一届#装机大 ...

  9. 【JavaScript系列】JS基础语法_从变量到数组一网打尽_有教程有实战

    [JavaScript系列]基础语法_从变量到数组一网打尽_有教程有实战 JavaScript基础语法目录 基础语法 延迟和异步脚本 变量 数据类型 数据类型简介 简单数据类型与复杂数据类型 栈和堆 ...

  10. onkeypress属性添加报错_亚马逊运营过程中listing常见报错及应对策略汇总

    亚马逊运营过程中listing常见报错及应对策略汇总 做亚马逊的小哥哥小姐姐们还在为上传产品中的报错提示而抓狂吗?福利来了,总结了17个常见报错,供大家查阅 1.SKU XXXXX, Missing ...

最新文章

  1. mysql远程连接授权
  2. android圆形图形的设置
  3. 什么防盗门都是浮云~
  4. Ubuntu16.04安装WPS
  5. ignite mysql_redis、ignite、mysql memory 内存数据库性能测试对比
  6. 《Linux编程》学习笔记 ·000【Linux介绍】
  7. pdf python 3.7编程快速入门 潘中强_无python基础,这些书籍可以帮您快速入门。
  8. bzoj1226: [SDOI2009]学校食堂Dining
  9. Java之编写FlyBird小游戏
  10. axure动态面板的简单介绍
  11. CSU_1505_酷酷的单词
  12. 简易 shell 爬搜狐
  13. [VMware]9破解版
  14. 王者荣耀鸿蒙抽奖,爆料:天行者抽奖乾坤福袋鸿蒙秘宝将再出现
  15. 使用git push推送时出现错误error: failed to push some refs to ‘https://gitee.com/yang-yimu/vue_shop.git‘
  16. STM32 SPI+DMA 驱动 SRAM LY68L6400SLIT 应用笔记
  17. 外行假装内行,我也来谈谈SAP BAPI和BADI
  18. 【大数据Hadoop实战篇】
  19. 优必选科技眼中的AI机器人时代
  20. seajs 的api接口

热门文章

  1. scipy模块_misc模块,imread,imresize, imsave / imshow/ imrotate
  2. 大一计算机知识总结,大学计算机基础超详细知识点(高手总结)免费
  3. php新年倒计时源码,新年倒计时源码
  4. 傅里叶变换、短时傅里叶变换和小波变换的概述
  5. 保持简单:纪念丹尼斯·里奇
  6. matlab各相关系数的计算,matlab 相关系数的计算
  7. 什么是Trunk端口模式?此模式有何作用?
  8. 计算机设备统计报告,中国互联网络发展状况统计报告-中国科学院计算机网络信息中心.DOC...
  9. 协议和代理模式的概念
  10. MySQL官方提供的日志分析工具_MySQL 日志分析的几款工具-Fun言