⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap03.html

📁 利用软件开发
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<TR><TD WIDTH="28%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">HMODULE</FONT></TD>
<TD WIDTH="72%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">模块句柄</FONT></TD>
</TR>
<TR><TD WIDTH="28%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">HPALETTE</FONT></TD>
<TD WIDTH="72%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">颜色调色板句柄</FONT></TD>
</TR>
<TR><TD WIDTH="28%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">HPEN</FONT></TD>
<TD WIDTH="72%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">在设备上画图时用于指明线型的笔的句柄</FONT></TD>
</TR>
<TR><TD WIDTH="28%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">HRGN</FONT></TD>
<TD WIDTH="72%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">剪贴区域句柄</FONT></TD>
</TR>
<TR><TD WIDTH="28%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">HTASK</FONT></TD>
<TD WIDTH="72%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">独立于已执行任务的句柄</FONT></TD>
</TR>
<TR><TD WIDTH="28%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">HWND</FONT></TD>
<TD WIDTH="72%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">窗口句柄</FONT></TD>
</TR>
</TABLE>
</CENTER></P>

<FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">查看</FONT><FONT SIZE=3>Win32 SDK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文档或者浏览</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>头文件</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>如</FONT><FONT SIZE=3>windef.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>ctype.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>以及</FONT><FONT SIZE=3>winnt.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>等</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可以获得关于其它数据类型的定义,这些定义往往使用了</FONT><FONT SIZE=3>#define</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>typedef</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>等关键字。</P>
<P ALIGN="JUSTIFY">这里解释什么是应用程序的一个实例</FONT><FONT SIZE=3>(instance)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。最简单的理解可以用下面的例子来说明:比如说已经在</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中打开了一个“写字板”</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可以在“开始”菜单中的“程序</FONT><FONT SIZE=3>|</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>附件”下面找到它的快捷方式</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,现在你需要从另一篇文章里复制一部分内容到你正在写的这篇文章中,那么,你可以再打开一个“写字板”</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>注意写字板不是一个多文档应用程序,不能像在</FONT><FONT SIZE=3>Word</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中那样打开多个不同的文件</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,然后从该写字板中复制文件的内容到在前一个写字板内打开的文章中。这里,我们多次运行了同一个应用程序,在这个例子中,我们将所打开的两个写字板叫做该应用程序的两个实例。对于实例的更精确</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>当然也要比上面的例子要更难懂得多</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的定义,在</FONT><FONT SIZE=3>Win32 SDK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中是这样给出的:实例就是类中一特定对象类型的一个实例化对象</FONT><FONT SIZE=3>(instantiation)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,如一个特定的进程或线程,在多任务操作系统中,一个实例指所加载的应用程序或动态链接库的一份拷贝。刚开始时我们也许看不懂这一定义,不过没有关系,慢慢的就理解了。</FONT><FONT SIZE=3> </P>

<UL>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>注意:</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>尽管在前面给出的</FONT><FONT SIZE=3>WinMain</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>函数的原型中包括了一个名为</FONT><FONT SIZE=3>hPrevInstance</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>的</FONT><FONT SIZE=3>HINSTANCE</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>类型的参数,按照其字面上的意义,它所传递的是应用程序的前一个实例的句柄,但是,在</FONT><FONT SIZE=3>Win32</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>平台下,该参数的值总是为</FONT><FONT SIZE=3>NULL</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>,而不管是否有当前应用程序的实例在运行。在过去的</FONT><FONT SIZE=3>Windows 3.x</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>环境下编程,我们常常使用下面的代码来检查应用程序是否已有一个实例在运行:</LI></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>if (!hPrevInstance)</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>{</LI></P>
<P ALIGN="JUSTIFY"><LI>&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>// </FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>在此添加没有应用程序实例在运行时的所需执行的代码。</LI></P>
<P ALIGN="JUSTIFY"><LI>&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>// </FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>对于大多数应用程序,我们常在这里注册窗口类。</LI></P>
<P ALIGN="JUSTIFY"><LI>}</LI></P></UL>
<DIR>
<DIR>

</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">然而,在</FONT><FONT SIZE=3>Win32</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>操作系统</FONT><FONT SIZE=3>——Windows 95</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>Windows NT</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>以及其后续版本中,上面的</FONT><FONT SIZE=3>if</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>条件体中的代码总会被执行,因为</FONT><FONT SIZE=3>hPrevInstance</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>总是为</FONT><FONT SIZE=3>NULL</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>,因此</FONT><FONT SIZE=3>!hPrevInstance</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>恒为真。</P>
<P ALIGN="JUSTIFY">之所以这样,是因为在</FONT><FONT SIZE=3>Win32</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>环境下,每一个应用程序的实例都有自已独立的地址空间,因此,它们之间互相独立,互不干涉。但是,对于一些应用程序,只需要而且只应该有一个实例在运行。什么情况下会是这样呢?假设我们编写了一个应用程序,在默认情况下,该应用程序将在后台运行,通过按下程序所定义的某一个热键,应用程序将被激活。对于这样的应用程序,在同一时该只应该有一个实例在运行。另外,像</FONT><FONT SIZE=3>Windows NT</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>下在任务管理器,在同一时刻也只可以有一个实例在运行。</P>
<P ALIGN="JUSTIFY">使用下面的技巧可以保证在同一时刻只有应用程序的一个实例:</P></DIR>
</DIR>


<UL>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>#include "windows.h"</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI></LI></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>#define VK_X 0x58</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI></LI></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>int WINAPI WinMain (HINSTANCE hInstance,</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>HINSTANCE hPrevInstance,</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>LPSTR lpCmdLine,</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>int nCmdShow)</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>{</LI></P>
<P ALIGN="JUSTIFY"><LI>&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>if (!CreateMutex(NULL,TRUE,"No Previous Instance!"))</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;{</LI></P>
<P ALIGN="JUSTIFY"><LI>&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>MessageBox(NULL,"</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>创建</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>Mutex</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>失败</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>!","NoPrev",MB_OK|MB_SYSTEMMODAL);</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>return FALSE;</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;}</LI></P>
<P ALIGN="JUSTIFY"><LI>&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>if (GetLastError()==ERROR_ALREADY_EXISTS)</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;{</LI></P>
<P ALIGN="JUSTIFY"><LI>&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>MessageBox(NULL,"</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>已有</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>NoPrev</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>的一个实例在运行</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>, </FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>当前实例将被终止</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>!",</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>"NoPrev",MB_OK|MB_SYSTEMMODAL);</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>return FALSE;</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;}</LI></P>
<P ALIGN="JUSTIFY"><LI>&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>if(!RegisterHotKey(NULL,0x0001,MOD_CONTROL|MOD_SHIFT,VK_X))</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;{</LI></P>
<P ALIGN="JUSTIFY"><LI>&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>MessageBox(NULL,"</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>注册热键</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>Ctrl+Shift+X</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>失败</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>!",</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>"NoPrev",MB_OK|MB_SYSTEMMODAL);</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>return FALSE;</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;}</LI></P>
<P ALIGN="JUSTIFY"><LI>&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>MessageBox(NULL,"NoPrev</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>已启动</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>!\n\n</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>按下热键</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>Ctrl+Shift+X</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>将终止</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>NoPrev.",</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>"NoPrev",MB_OK|MB_SYSTEMMODAL);</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>MSG msg;</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>while (GetMessage(&amp;msg,NULL,0,0))</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;{</LI></P>
<P ALIGN="JUSTIFY"><LI>&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>switch (msg.message)</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;{</LI></P>
<P ALIGN="JUSTIFY"><LI>&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>case WM_HOTKEY:</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>if (int(msg.wParam)==0x0001)</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>if (MessageBox(NULL,"</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1>终止</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>NoPrev?",</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;&#9;&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>"NoPrev",MB_YESNO|MB_SYSTEMMODAL)==IDYES)</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;&#9;&#9;&#9;</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>return TRUE;</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY"><LI>&#9;&#9;}</LI></P>
<P ALIGN="JUSTIFY"><LI>&#9;}</LI></P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -