API函数详解:金山词霸启示录——定制系统菜单函数

    如何做到当我们单击窗体的最小化和关闭按钮时,窗体先最小化到任务栏成为按钮,然后消失呢?金山词霸能做到,我们也可以做到。     只要我们能截获这两个事件发送给窗体的消息,然后换成我们自定义的过程,问题就解决了。首先,用CloseWindow使窗体最小化;然后,用Form1.Visible = False使窗体消失。     这两个事件共用一个消息:WM_SYSCOMMAND,不同的是传递给窗口函数的wp参数。为取得这两个事件的wp参数,有两个方法     1、用vb的常数,这是一些以SC_为前缀的常数(S代表SYS,C代表COMMAND)     2、编程取得它们,事实上,我采用的是这种方法。在窗口放两个文本框,当任何WM_SYSCOMMAND消息发生时,先在文本框里显示wp和lp的值,很容易的发现,单击最小化按钮时,wp=61472;单击关闭按钮时,wp=61536。现在就可以开始编程了。     为了实现对窗体的子类处理,采用MsgHook32控件。     源代码如下:    Option Explicit

    ' API函数声明
   Private Declare Function CloseWindowLib "user32" (ByVal hwndAs Long)As Long

    ' 常数声明
   Private Const WM_SYSCOMMAND = &H112

   Private Sub Form_Load()
        Msghook1.HwndHook = Form1.hwnd
        ' 将Msghook1绑定到Form1上
        Msghook1.Message(WM_SYSCOMMAND) =True
        ' Msghook1拦截WM_SYSCOMMAND消息
   End Sub

   Private Sub Msghook1_Message(ByVal msgAs Long,ByVal wpAs Long,ByVal lpAs Long, resultAs Long)
        Text1.Text = wp
        Text2.Text = lp
       If wp = 61472Or wp = 61536Then
        ' 单击的是最小化或关闭按钮
            CloseWindow Form1.hwnd
            ' 最小化窗口
            Form1.Visible =False
            ' 使窗口消失
            Unload Form1
            ' 卸载窗口。如果有通知栏图标,就不用卸载窗口
        Else
           Call Msghook1.InvokeWindowProc(msg, wp, lp)
            ' 其他的事件由默认窗口函数处理
        End If
    End Sub     不仅是单击窗口右上角的按钮,其实,在系统菜单里选择最小化和关闭菜单项,也有同样的效果。到此,对金山词霸的一个小秘密就发觉出来了,接下来,就看看如何实现通知栏图标吧。

上页:API函数详解:XFORM函数 下页:API函数详解:AbortPath函数

Windows API函数大全

Windows API函数首页Windows API函数按字母排列
控件与消息函数硬件与系统函数
设备场景函数绘图函数
位图、图标和光栅运算函数菜单函数
文本和字体函数打印函数
文件处理函数进程和线程函数
Windows消息函数网络函数
版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号