摘要:研究下托盘程序,或者说:任务栏通知区域(Tray)图标。很多应用程序在系统Shell任务栏通知区域有图标提示。通知区域图标适用于长时间运行但无需用户过多操作,并在有事件发生时可随时根据情况通知用户的应用程序(如即时通信工具、下载工具等)。使用任务通知区域图标的好处如下:1) 窗口程序可以在后台运行,窗口退出,但是程序仍然在运行,减少窗口数量,便于用户操作;2) 窗口最小化后,不占用任务栏的位置,使用户在操作主机时将精力集中在需关注的窗口;3) 在新事件发生时(如新的即时消息、文件下载完成等),可以即时通知到用户;4) 用户通过单击、双击图标、图标菜单等可以很方便地配置应用程序,控制应用程序的运
阅读全文
摘要:1)设计一个窗口过程:下面的实例代码展现了经典的窗口过程的结构。窗口过程使用switch语句处理传入的消息参数uMsg,LRESULT CALLBACK MainWndProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam) // second message parameter{ switch (uMsg) { case WM_CREATE: // Initialize the window...
阅读全文
摘要:线程局部存储(Thread Local Storage,TLS)用来将数据与一个正在执行的指定线程关联起来。我们在应用程序和DLL中可以使用两种类型的TLS:动态TLS和静态TLS。但一般来说,这两项技术在创建DLL的时候更加有用,这是因为DLL通常并不知道它们被链接到的应用程序的结构是什么样的。但是在编写应用程序时,我们一般都知道自己要创建多少线程,自己会如何使用这些线程。然后我们就可以设计一些替代方案来为每个线程关联数据,或者设计得好一点的话,可以使用基于栈的方法(局部变量)来为每个线程关联数据。动态TLS:一般通过调用一组4个API函数来使用动态TLS,这些函数实际上最经常为DLL使用。
阅读全文
摘要:一般情况下,应用程序使用的内存空间里有以下“默认”的区域:1)栈:用于维护函数调用的上下文,离开了栈函数调用就没法实现。栈通常在用户空间的最高地址处分配,通常有数兆字节的大小;2)堆:用来容纳应用程序动态分配的内存区域,当程序使用malloc或new分配内存时,得到的内存来自堆里。堆通常存在于栈的下方(低地址方向),在某些时候,堆也可能没有固定统一的存储区域,堆一般比栈大很多,可以有几十到数百兆字节的容量;3)可执行文件映像:存储着可执行文件在内存中的映像。由装载器在装载时将可执行文件的内存读取或映射到这里。4)保留区:这并不是一个单一的内存区域,而是对内存中受到保护而禁止访问的内存区域的总称
阅读全文
摘要:要显示“查找”和“替换”文本对话框分别使用函数FindText和ReplaceText:HWND WINAPI FindText( __in LPFINDREPLACE lpfr);HWND WINAPI ReplaceText( __inout LPFINDREPLACE lpfr);这两个函数都使用同样的FINDREPLACE结构:typedef struct { DWORD lStructSize; //结构长度 HWND hwndOwner; //所属窗口 HINSTANCE hInstance; // DWORD Flags; //标志 LPTSTR lpstrFindWhat; /
阅读全文
摘要:“字体”通用对话框列出了系统中安装的字体,用户可以在上面选择字体名称,同时可以选择字体大小、颜色,以及一些效果如斜线、粗体、删除线或下划线等,显示选择“字体”对话框的函数是ChooseFont:BOOL WINAPI ChooseFont( __inout LPCHOOSEFONT lpcf);lpcf指向CHOOSEFONT结构:typedef struct { DWORD lStructSize; //结构长度 HWND hwndOwner; //所属窗口 HDC hDC; //当Flags标志指定CF_PRINTERFONTS标志时,它是打印机的DC句柄 LPLOGFONT lpLogF
阅读全文
摘要:Windows操作系统为一些常用功能提供了一些通用对话框(Common Dialog Box),比如,在不同应用程序中运行打开文件、选择字体、选择颜色等操作时,不同程序显示的对话框的模样都是一样。这些对话框是操作系统提供的,实现对话框的代码封装在Comdlg32.dll库文件中,由于不同版本的Comdlg32.dll在设计上可能有所不同,所以不同版本的Windows下对话框会有所不同。Windows提供多种通用对话框,每种通用对话框都使用一个专用的函数来创建和显示,另外,提供一个数据结构供初始化对话框使用,并在同一个数据结构中返回用户在对话框中输入的数据。“打开”文件和“保存”文件对话框显示“
阅读全文
摘要:方法一:Shell调用:Win32中可以通过WinExec和ShellExecute函数来执行另一个可执行程序。WinExec函数原型如下:UINT WINAPI WinExec( __in LPCSTR lpCmdLine, //包含可执行文件名和命令行参数 __in UINT uCmdShow //指定窗口的显示方式,如果有窗口的话);如果文件被成功执行,那么函数返回一个大于31的值。使用WinExec函数执行文件和在Windows“开始”菜单的“运行”中键入命令在效果上是一样的。注意,该函数是为了兼容16位Windows而保留的!!函数ShellExecute即可以用来执行一个可执行文件
阅读全文
摘要:Windows中的文件组织方式采用分层次的结构:计算机中可以安装有多个物理驱动器,每个物理驱动器可以分为多个主分区和扩展分区,每个主分区就是一个逻辑驱动器,而每个扩展分区可以划分为多个逻辑驱动器,逻辑驱动器组成我们熟悉的C盘与D盘等盘符。对于每个逻辑驱动器,可以给它取一个标号叫做“卷标”,卷标是当作一个目录项存放在逻辑驱动器的根目录中的。逻辑驱动器操作:SetVolumeLabel函数用来为一个驱动器创建、修改以及删除卷标:BOOL WINAPI SetVolumeLabel( __in_opt LPCTSTR lpRootPathName, //要设置卷标的逻辑驱动器根目录,如“c:/” _
阅读全文
摘要:Windows的“堆”分为默认堆和私有堆两种。默认堆是在程序初始化时由操作系统自动创建的,所有标准内存管理函数都是在默认堆中申请内存的;而私有堆相当于在默认堆中保留了一大块内存,用堆管理函数可以在这个保留的内存区域中分配内存。一个进程的默认堆只有一个,而私有堆可以被创建多个。默认堆可以直接被使用,而私有堆在使用前需要先创建,使用私有堆有很多好处:1)可以使用默认堆的函数有多种,而它们可能在不同的线程中同时对默认堆进行操作,为了保持同步,对默认堆的访问是顺序进行的;而私有堆的空间是预留的,不同线程在不同的私有堆中同时分配内存并不会引起冲突,所以整体的运行速度更快。2)当系统必须在物理内存和页文件
阅读全文