你应该在网上找一下WindowsAPI for VB的帮助文件,里面详细介绍了用法。
我给你粘贴一些:
××××××××××××××××××××××××××
相信你一定用过金山词霸Ⅲ,这个程序有很多值得程序员学习的地方。 比如,窗口有最小尺寸;可以在任务栏按钮和通知栏图标之间切换;当窗体最小化成任务栏按钮时,右击它出现的是自定义菜单,替换了系统菜单,而当窗体显示在屏幕上时,右击标题栏出现的是系统菜单,此时单击任务栏按钮时,不会弹出任何菜单;在通知栏图标状态下,按最小化、关闭按钮时窗体会最小化到任务栏,然后就不见了,等等。当然,最主要的,还是屏幕取词了。 这些功能如果能否在我们的程序中实现呢?我最近一直在研究,现在终于有了一点眉目,除了屏幕取词之外,其他的特性基本都能作到了。现在就让我们来看看这些功能都是如何实现的把。 首先,作为预备知识,建议你先看看《屏蔽文本框默认的右键菜单——浅谈如何控制Windows消息》这篇文章,因为所有这些功能的实现都要用到子类处理。然后,为了方便程序的编制和调试,我用的是两个Free的控件——MessageBlaster32 Ole Control 和MsgHook32,这两个控件都只有28K,但它们的功能实在强大,如果你需要这些控件,请到例程里去下载它,这些控件的属性、方法、事件非常简单,你也可以看看我写的使用说明 好了,现在就开始把,先来看看单击最小化、关闭按钮怎样使窗体先缩到任务栏成为按钮,然后消失的把 金山词霸启示录——定制系统菜单
金山词霸启示录——定制系统菜单 如何做到当我们单击窗体的最小化和关闭按钮时,窗体先最小化到任务栏成为按钮,然后消失呢?金山词霸能做到,我们也可以做到。 只要我们能截获这两个事件发送给窗体的消息,然后换成我们自定义的过程,问题就解决了。首先,用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 CloseWindow Lib "user32" (ByVal hwnd As 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 msg As Long, ByVal wp As Long, ByVal lp As Long, result As Long)
Text1.Text = wp
Text2.Text = lp
If wp = 61472 Or wp = 61536 Then
' 单击的是最小化或关闭按钮
CloseWindow Form1.hwnd
' 最小化窗口
Form1.Visible = False
' 使窗口消失
Unload Form1
' 卸载窗口。如果有通知栏图标,就不用卸载窗口
Else
Call Msghook1.InvokeWindowProc(msg, wp, lp)
' 其他的事件由默认窗口函数处理
End If
End Sub 不仅是单击窗口右上角的按钮,其实,在系统菜单里选择最小化和关闭菜单项,也有同样的效果。到此,对金山词霸的一个小秘密就发觉出来了,接下来,就看看如何实现通知栏图标吧。
金山词霸启示录——通知栏图标 通知栏图标,可以用一个免费的小控件:SysTray实现。也可以用一个子类处理控件来实现。后一种方法比较自由,所以我采用了后一种方法。除了一个子类处理控件,还需要一个api函数:Shell_NotifyIcon,以及一个结构:NOTIFYICONDATA。关于它们的说明本站都有,这里就不用费舌了。 添加、修改、移除通知栏图标都比较简单,关键是如何让它响应鼠标事件。在NOTIFYICONDATA结构中,uCallbackMessage字段定义了通知栏图标响应的事件,hwnd字段则定义了响应事件的对象。 在程序里,利用一个图片框来响应通知栏图标的鼠标事件。只需简单的定义NOTIFYICONDATA.hwnd = Picture1.hwnd,那么一旦uCallbackMessage定义的消息在Picture1上发生,就可以看作通知栏图标事件发生了。 所以将子类处理控件绑定到图片框,其拦截的消息为uCallbackMessage定义的消息编号,这里令NOTIFYICONDATA.uCallbackMessage = WM_TrayIcon,而WM_TrayIcon = &H2000(自定义消息) 一旦这个消息被拦截,就可以根据不同的lp参数判断发生的是那一个鼠标动作,事实上我们只需要对鼠标的左右按钮单击事件作出响应(这两个消息分别为WM_LBUTTONUP、WM_RBUTTONUP) 然后再做一个菜单,当WM_RBUTTONUP发生时,就弹出来。 最后请注意,卸载程序时记得移除通知栏图标
我给你粘贴一些:
××××××××××××××××××××××××××
相信你一定用过金山词霸Ⅲ,这个程序有很多值得程序员学习的地方。 比如,窗口有最小尺寸;可以在任务栏按钮和通知栏图标之间切换;当窗体最小化成任务栏按钮时,右击它出现的是自定义菜单,替换了系统菜单,而当窗体显示在屏幕上时,右击标题栏出现的是系统菜单,此时单击任务栏按钮时,不会弹出任何菜单;在通知栏图标状态下,按最小化、关闭按钮时窗体会最小化到任务栏,然后就不见了,等等。当然,最主要的,还是屏幕取词了。 这些功能如果能否在我们的程序中实现呢?我最近一直在研究,现在终于有了一点眉目,除了屏幕取词之外,其他的特性基本都能作到了。现在就让我们来看看这些功能都是如何实现的把。 首先,作为预备知识,建议你先看看《屏蔽文本框默认的右键菜单——浅谈如何控制Windows消息》这篇文章,因为所有这些功能的实现都要用到子类处理。然后,为了方便程序的编制和调试,我用的是两个Free的控件——MessageBlaster32 Ole Control 和MsgHook32,这两个控件都只有28K,但它们的功能实在强大,如果你需要这些控件,请到例程里去下载它,这些控件的属性、方法、事件非常简单,你也可以看看我写的使用说明 好了,现在就开始把,先来看看单击最小化、关闭按钮怎样使窗体先缩到任务栏成为按钮,然后消失的把 金山词霸启示录——定制系统菜单
金山词霸启示录——定制系统菜单 如何做到当我们单击窗体的最小化和关闭按钮时,窗体先最小化到任务栏成为按钮,然后消失呢?金山词霸能做到,我们也可以做到。 只要我们能截获这两个事件发送给窗体的消息,然后换成我们自定义的过程,问题就解决了。首先,用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 CloseWindow Lib "user32" (ByVal hwnd As 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 msg As Long, ByVal wp As Long, ByVal lp As Long, result As Long)
Text1.Text = wp
Text2.Text = lp
If wp = 61472 Or wp = 61536 Then
' 单击的是最小化或关闭按钮
CloseWindow Form1.hwnd
' 最小化窗口
Form1.Visible = False
' 使窗口消失
Unload Form1
' 卸载窗口。如果有通知栏图标,就不用卸载窗口
Else
Call Msghook1.InvokeWindowProc(msg, wp, lp)
' 其他的事件由默认窗口函数处理
End If
End Sub 不仅是单击窗口右上角的按钮,其实,在系统菜单里选择最小化和关闭菜单项,也有同样的效果。到此,对金山词霸的一个小秘密就发觉出来了,接下来,就看看如何实现通知栏图标吧。
金山词霸启示录——通知栏图标 通知栏图标,可以用一个免费的小控件:SysTray实现。也可以用一个子类处理控件来实现。后一种方法比较自由,所以我采用了后一种方法。除了一个子类处理控件,还需要一个api函数:Shell_NotifyIcon,以及一个结构:NOTIFYICONDATA。关于它们的说明本站都有,这里就不用费舌了。 添加、修改、移除通知栏图标都比较简单,关键是如何让它响应鼠标事件。在NOTIFYICONDATA结构中,uCallbackMessage字段定义了通知栏图标响应的事件,hwnd字段则定义了响应事件的对象。 在程序里,利用一个图片框来响应通知栏图标的鼠标事件。只需简单的定义NOTIFYICONDATA.hwnd = Picture1.hwnd,那么一旦uCallbackMessage定义的消息在Picture1上发生,就可以看作通知栏图标事件发生了。 所以将子类处理控件绑定到图片框,其拦截的消息为uCallbackMessage定义的消息编号,这里令NOTIFYICONDATA.uCallbackMessage = WM_TrayIcon,而WM_TrayIcon = &H2000(自定义消息) 一旦这个消息被拦截,就可以根据不同的lp参数判断发生的是那一个鼠标动作,事实上我们只需要对鼠标的左右按钮单击事件作出响应(这两个消息分别为WM_LBUTTONUP、WM_RBUTTONUP) 然后再做一个菜单,当WM_RBUTTONUP发生时,就弹出来。 最后请注意,卸载程序时记得移除通知栏图标
Option Explicit
'Win32 API declaration
Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean' Constants used to detect clicking on the icon
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONUP = &H205
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202' Constants used to control the icon
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIF_MESSAGE = &H1
Public Const NIM_DELETE = &H2
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4' Used as the ID of the call back message
Public Const WM_MOUSEMOVE = &H200' Used by Shell_NotifyIcon
Public Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uId As Long
uFlags As Long
ucallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type'create variable of type NOTIFYICONDATA
Public TrayIcon As NOTIFYICONDATAVERSION 5.00
Begin VB.Form frmTrayIcon
Caption = "Mind's Tray Icon Example"
ClientHeight = 1485
ClientLeft = 2625
ClientTop = 2175
ClientWidth = 3480
Icon = "TrayIcon.frx":0000
LinkTopic = "Form1"
LockControls = -1 'True
PaletteMode = 1 'UseZOrder
ScaleHeight = 1485
ScaleWidth = 3480
Begin VB.CommandButton cmdExit
Caption = "E&xit"
Height = 375
Left = 1200
TabIndex = 0
Top = 840
Width = 1215
End
Begin VB.Image imgIcon2
Height = 480
Left = 1920
Picture = "TrayIcon.frx":030A
Top = 240
Width = 480
End
Begin VB.Image imgIcon1
Height = 480
Left = 1200
Picture = "TrayIcon.frx":074C
Top = 240
Width = 480
End
Begin VB.Menu mnuPopUp
Caption = "PopUp_Menu"
Visible = 0 'False
Begin VB.Menu mnuChange
Caption = "Change &Icon"
End
Begin VB.Menu line2
Caption = "-"
End
Begin VB.Menu mnuExit
Caption = "E&xit"
End
Begin VB.Menu line
Caption = "-"
End
Begin VB.Menu mnuAbout
Caption = "&About"
End
End
End
Attribute VB_Name = "frmTrayIcon"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option ExplicitPrivate Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As LongConst SW_RESTORE = 9Const SW_SHOWNORMAL = 1Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_SYSCOMMAND = &H112
Private Const SC_MOVE = &HF010&
Private Const SC_RESTORE = &HF120&
Private Const SC_SIZE = &HF000&
Private Sub cmdExit_Click() Unload Me
End Sub
Private Sub Form_Load()
'centers form
Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2 'sets cbSize to the Length of TrayIcon
TrayIcon.cbSize = Len(TrayIcon)
' Handle of the window used to handle messages - which is the this form
TrayIcon.hwnd = Me.hwnd
' ID code of the icon
TrayIcon.uId = vbNull
' Flags
TrayIcon.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
' ID of the call back message
TrayIcon.ucallbackMessage = WM_MOUSEMOVE
' The icon - sets the icon that should be used
TrayIcon.hIcon = imgIcon1.Picture
' The Tooltip for the icon - sets the Tooltip that will be displayed
TrayIcon.szTip = "Mind's Tray Icon Example" & Chr$(0)
' Add icon to the tray by calling the Shell_NotifyIcon API
'NIM_ADD is a Constant - add icon to tray
Call Shell_NotifyIcon(NIM_ADD, TrayIcon)
' Don't let application appear in the Windows task list
App.TaskVisible = False
Me.Hide
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)Static Message As Long
Static RR As Boolean
'x is the current mouse location along the x-axis
Message = X / Screen.TwipsPerPixelX
If RR = False Then
RR = True
Select Case Message
Case WM_LBUTTONUP
'Me.Visible = True
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_RESTORE, 0&
ShowWindow Me.hwnd, SW_SHOWNORMAL
SetForegroundWindow Me.hwnd
' ' Left double click (This should bring up a dialog box)
' Case WM_LBUTTONDBLCLK
' 'Me.Visible = True
'
' Me.Show
'
' SetForegroundWindow Me.hwnd
' Me.SetFocus
' ' Right button up (This should bring up a menu)
Case WM_RBUTTONUP
Me.PopupMenu mnuPopUp
End Select
RR = False
End If
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) TrayIcon.cbSize = Len(TrayIcon)
TrayIcon.hwnd = Me.hwnd
TrayIcon.uId = vbNull
'Remove icon for Tray
Call Shell_NotifyIcon(NIM_DELETE, TrayIcon)
End Sub
Private Sub Form_Resize() If Me.WindowState = vbMinimized Then
Me.Hide
End If
End SubPrivate Sub mnuAbout_Click() frmAbout.ShowEnd SubPrivate Sub mnuChange_Click() 'checks to find what icon is currently displayed
If TrayIcon.hIcon = imgIcon1.Picture Then
'changes the icon to display
TrayIcon.hIcon = imgIcon2.Picture
'removes current icon from tray
Call Shell_NotifyIcon(NIM_DELETE, TrayIcon)
'calls the API to add in new icon
Call Shell_NotifyIcon(NIM_ADD, TrayIcon)
Else
'changes the icon to display
TrayIcon.hIcon = imgIcon1.Picture
'removes current icon from tray
Call Shell_NotifyIcon(NIM_DELETE, TrayIcon)
'calls the API to add in new icon
Call Shell_NotifyIcon(NIM_ADD, TrayIcon)
End If
End Sub
Private Sub mnuExit_Click() Unload MeEnd Sub