📄 documents3_1.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<style><!--
body,table {font-family:"宋体"; font-size: 9pt; line-height:11pt;}
a {text-decoration:none} a:hover {color:red;text-decoration:underline}
--></style>
<title>金山词霸启示录——定制系统菜单</title>
</head>
<body link="#FF0000" vlink="#FF0000" alink="#FF0000" bgcolor="#FFC8C8">
<table border="0" width="100%" cellspacing="4" cellpadding="6">
<tr>
<td width="100%" bgcolor="#336699"><font color="#FFFFFF">金山词霸启示录——定制系统菜单</font></td>
</tr>
</table>
<p>
如何做到当我们单击窗体的最小化和关闭按钮时,窗体先最小化到任务栏成为按钮,然后消失呢?金山词霸能做到,我们也可以做到。</p>
<p>
只要我们能截获这两个事件发送给窗体的消息,然后换成我们自定义的过程,问题就解决了。首先,用CloseWindow使窗体最小化;然后,用Form1.Visible
= False使窗体消失。</p>
<p> 这两个事件共用一个消息:WM_SYSCOMMAND,不同的是传递给窗口函数的wp参数。为取得这两个事件的wp参数,有两个方法</p>
<p> 1、用vb的常数,这是一些以SC_为前缀的常数(S代表SYS,C代表COMMAND)</p>
<p> 2、编程取得它们,事实上,我采用的是这种方法。在窗口放两个文本框,当任何WM_SYSCOMMAND消息发生时,先在文本框里显示wp和lp的值,很容易的发现,单击最小化按钮时,wp=61472;单击关闭按钮时,wp=61536。现在就可以开始编程了。</p>
<p> 为了实现对窗体的子类处理,采用MsgHook32控件。</p>
<p> 源代码如下:</p>
<p><font color="#000080"> Option Explicit<br>
</font><br>
<font color="#008000"> ' API函数声明<br>
</font> <font color="#000080">Private Declare Function</font>
CloseWindow <font color="#000080">Lib</font> "user32" (<font color="#000080">ByVal</font>
hwnd <font color="#000080">As Long</font>) <font color="#000080">As Long</font><br>
<br>
<font color="#008000"> ' 常数声明<br>
</font> <font color="#000080">Private Const</font> WM_SYSCOMMAND =
&H112<br>
<br>
<font color="#000080">Private Sub</font> Form_Load()<br>
Msghook1.HwndHook = Form1.hwnd<br>
<font color="#008000"> ' 将Msghook1绑定到Form1上<br>
</font> Msghook1.Message(WM_SYSCOMMAND) = <font
color="#000080">True</font><br>
<font color="#008000"> ' Msghook1拦截WM_SYSCOMMAND消息<br>
</font> <font color="#000080">End Sub</font><br>
<br>
<font color="#000080">Private Sub</font> Msghook1_Message(<font
color="#000080">ByVal</font> msg <font color="#000080">As Long</font>, <font
color="#000080">ByVal</font> wp <font color="#000080">As Long</font>, <font
color="#000080">ByVal</font> lp <font color="#000080">As Long</font>, result <font
color="#000080">As Long</font>)<br>
Text1.Text = wp<br>
Text2.Text = lp<br>
<font color="#000080">If</font> wp = 61472 <font
color="#000080">Or</font> wp = 61536 <font color="#000080">Then</font><br>
<font color="#008000"> '
单击的是最小化或关闭按钮<br>
</font> CloseWindow
Form1.hwnd<br>
<font color="#008000"> '
最小化窗口<br>
</font> Form1.Visible = <font
color="#000080">False</font><br>
<font color="#008000"> '
使窗口消失<br>
</font> Unload Form1<br>
<font color="#008000"> '
卸载窗口。如果有通知栏图标,就不用卸载窗口<br>
</font><font color="#000080"> Else<br>
</font> <font
color="#000080">Call</font> Msghook1.InvokeWindowProc(msg, wp, lp)<br>
<font color="#008000"> '
其他的事件由默认窗口函数处理<br>
</font><font color="#000080"> End If<br>
End Sub</font></p>
<p>
不仅是单击窗口右上角的按钮,其实,在系统菜单里选择最小化和关闭菜单项,也有同样的效果。到此,对金山词霸的一个小秘密就发觉出来了,接下来,就看看<a
href="Documents3_2.htm">如何实现通知栏图标</a>吧。</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -