Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias " Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
ch21st
ch21st
等级:
#3 得分:21回复于: 2002-11-15 18:13:24
Shell_NotifyIcon

Private 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

Private Const NIM_ADD = &H0
Private Const NIM_MODIFY = &H1
Private Const NIM_DELETE = &H2
Private Const NIF_MESSAGE = &H1
Private Const NIF_ICON = &H2
Private Const NIF_TIP = &H4

Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_RBUTTONUP = &H205

Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
Dim TrayI As NOTIFYICONDATA
Private Sub Form_Load()
    TrayI.cbSize = Len(TrayI)
    'Set the window's handle (this will be used to hook the specified window)
    TrayI.hWnd = pichook.hWnd
    'Application-defined identifier of the taskbar icon
    TrayI.uId = 1&
    'Set the flags
    TrayI.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
    'Set the callback message
    TrayI.ucallbackMessage = WM_LBUTTONDOWN
    'Set the picture (must be an icon!)
    TrayI.hIcon = imgIcon(2).Picture
    'Set the tooltiptext
    TrayI.szTip = "Recent" & Chr$(0)
    'Create the icon
    Shell_NotifyIcon NIM_ADD, TrayI

Me.Hide
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'remove the icon
    TrayI.cbSize = Len(TrayI)
    TrayI.hWnd = pichook.hWnd
    TrayI.uId = 1&
    Shell_NotifyIcon NIM_DELETE, TrayI
    End
End Sub
Private Sub mnuPop_Click(Index As Integer)
    Select Case Index
        Case 0
            MsgBox "KPD-Team 1998" + , vbInformation + vbOKOnly
        Case 2
            Unload Me
    End Select
End Sub
Private Sub pichook_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Msg = X / Screen.TwipsPerPixelX
    If Msg = WM_LBUTTONDBLCLK Then
        'Left button double click
        mnuPop_Click 0
    ElseIf Msg = WM_RBUTTONUP Then
        'Right button click
        Me.PopupMenu mnuPopUp
    End If
End Sub
Private Sub Timer1_Timer()
    Static Tek As Integer
    'Animate the icon
    Me.Icon = imgIcon(Tek).Picture
    TrayI.hIcon = imgIcon(Tek).Picture
    Tek = Tek + 1
    If Tek = 3 Then Tek = 0
    Shell_NotifyIcon NIM_MODIFY, TrayI
End Sub

SendMessage

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long
Const LB_FINDSTRING = &H18F
Private Sub Form_Load()
    With List1
        .AddItem "Computer"
        .AddItem "Screen"
        .AddItem "Modem"
        .AddItem "Printer"
        .AddItem "Scanner"
        .AddItem "Sound Blaster"
        .AddItem "Keyboard"
        .AddItem "CD-Rom"
        .AddItem "Mouse"
    End With
End Sub
Private Sub Text1_Change()
    'Retrieve the item's listindex
    List1.ListIndex = SendMessage(List1.hwnd, LB_FINDSTRING, -1, ByVal CStr(Text1.Text))
End Sub

SetWindowLong

Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'Subclass this form
    HookForm Me
    'Register this form as a Clipboardviewer
    SetClipboardViewer Me.hwnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'Unhook the form
    UnHookForm Me
End Sub
Private Sub Command1_Click()
    'Change the clipboard
    Clipboard.Clear
    Clipboard.SetText "Hello !"
End Sub

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetClipboardViewer Lib "user32" (ByVal hwnd As Long) As Long
Public Const WM_DRAWCLIPBOARD = &H308
Public Const GWL_WNDPROC = (-4)
Dim PrevProc As Long
Public Sub HookForm(F As Form)
    PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHookForm(F As Form)
    SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc
End Sub
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
    If uMsg = WM_DRAWCLIPBOARD Then
        MsgBox "Clipboard changed ..."
    End If
End Function

ch21st
ch21st
等级:
#4 得分:9回复于: 2002-11-15 18:17:41
CallWindowProc

Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Private Sub Form_Load()
    On Error Resume Next
     Dim lb As Long, pa As Long
    'map 'user32' into the address space of the calling process.
    lb = LoadLibrary("user32")
    'retrieve the address of 'SetWindowTextA'
    pa = GetProcAddress(lb, "SetWindowTextA")
    'Call the SetWindowTextA-function
    CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
    'unmap the library's address
    FreeLibrary lb
End Sub

GetWindowLong

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Const GWL_STYLE = (-16)
Const ES_NUMBER = &H2000&
Public Sub SetNumber(NumberText As TextBox, Flag As Boolean)
    Dim curstyle As Long, newstyle As Long

'retrieve the window style
    curstyle = GetWindowLong(NumberText.hwnd, GWL_STYLE)

If Flag Then
       curstyle = curstyle Or ES_NUMBER
    Else
       curstyle = curstyle And (Not ES_NUMBER)
    End If

'Set the new style
    newstyle = SetWindowLong(NumberText.hwnd, GWL_STYLE, curstyle)
    'refresh
    NumberText.Refresh
End Sub
Private Sub Form_Load()
    SetNumber Text1, True
    Me.Caption = "Now, try typing some letters into the textbox"
End Sub

zyl910
zyl910
等级:
 
 
8

更多勋章

#5 得分:12回复于: 2002-11-15 21:56:40
shell_notifyicon是操作托盘图标
NOTIFYICONDATA.hWnd 是接受消息的窗体句柄
NOTIFYICONDATA.ucallbackMessage 是回调消息的消息编号

回调消息的lParam常数就是在托盘上的鼠标消息

SendMessage是发送Windows消息,wParam、lParam根据发送的消息的不同而不同

CallWindowProc是向消息处理函数传递消息,主要用于 子类处理消息 技术

GetWindowLong,SetWindowLong是用于取得、设置窗体的某些属性,GWL_WNDPROC是用于取得、设置窗体的消息处理程序地址

shawls
shawls
等级:
#6 得分:8回复于: 2002-11-16 01:02:32
[名称]           VB托盘程序源代码

[语言种类]       Visual Basic

[类别一]         界面

[类别二]         空

[类别三]         空

[数据来源]       未知

[保存时间]       2002-01-05

[关键字一]       API

[关键字二]       托盘

[关键字三]       空

[内容简介]       空

[源代码内容]

'Type NOTIFYICONDATA
' cbSize As Long 需填入NOTIFYICONDATA数据结构的长度
' HWnd As Long 设置成窗口的句柄
' Uid As Long 为图标所设置的ID值
' UFlags As Long 用来设置以下三个参数uCallbackMessage、hIcon、szTip是否有效
' UCallbackMessage As Long 消息编号
' HIcon As Long 显示在状态栏上的图标
' SzTip As String * 64 提示信息
'End Type

'---- 其中参数uCallbackMessage、hIcon、szTip也应在模块中声明为以下的常量:
'Public Const NIF_MESSAGE = 1
'Public Const NIF_ICON = 2
'Public Const NIF_TIP = 4

Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

Public Const WM_USER = &H400
Public Const WM_LBUTTONUP = &H202
Public Const WM_MBUTTONUP = &H208
Public Const WM_RBUTTONUP = &H205
Public Const TRAY_CALLBACK = (WM_USER + 1001&)
Public Const GWL_WNDPROC = (-4)
Public Const GWL_USERDATA = (-21)
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIF_MESSAGE = &H1
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2

'记录 设置托盘图标的数据 的数据类型NOTIFYICONDATA
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

'TheData变量记录设置托盘图标的数据
Private TheData As NOTIFYICONDATA
' *********************************************
' 新的窗口过程--主程序中采用SetWindowLong函数改变了窗口函数的地址,消息转向由NewWindowProc处理
' *********************************************
Public Function NewWindowProc(ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'如果用户点击了托盘中的图标,则进行判断是点击了左键还是右键
If Msg = TRAY_CALLBACK Then
'如果点击了左键
If lParam = WM_LBUTTONUP Then
'而这时窗体的状态是最小化时
If TheForm.WindowState = vbMinimized Then _
'恢复到最小化前的窗体状态
TheForm.WindowState = TheForm.LastState
TheForm.SetFocus
Exit Function
End If
End If
'如果点击了右键
If lParam = WM_RBUTTONUP Then
'则弹出右键菜单
TheForm.PopupMenu TheMenu
Exit Function
End If
End If'如果是其他类型的消息则传递给原有默认的窗口函数
NewWindowProc = CallWindowProc(OldWindowProc, HWnd, Msg, wParam, lParam)
End Function
' *********************************************
' 把主窗体的图标(Form1.icon属性可改变)添加到托盘中
' *********************************************
Public Sub AddToTray(frm As Form, mnu As Menu)

'保存当前窗体和菜单信息
Set TheForm = frm
Set TheMenu = mnu

'GWL_WNDPROC获得该窗口的窗口函数的地址
OldWindowProc = SetWindowLong(frm.HWnd, GWL_WNDPROC, AddressOf NewWindowProc)

'知识点滴:HWnd属性
'返回窗体或控件的句柄。语法: object.HWnd
'说明:Microsoft Windows 运行环境,通过给应用程序中的每个窗体和控件
'分配一个句柄(或 hWnd)来标识它们。hWnd 属性用于Windows API调用。

'将主窗体图标添加在托盘中
With TheData
.Uid = 0 '忘了吗?参考一下前面内容,Uid图标的序号,做动画图标有用
.HWnd = frm.HWnd
.cbSize = Len(TheData)
.HIcon = frm.Icon.Handle
.UFlags = NIF_ICON '指明要对图标进行设置
.UCallbackMessage = TRAY_CALLBACK
.UFlags = .UFlags Or NIF_MESSAGE '指明要设置图标或返回信息给主窗体,此句不能省去
.cbSize = Len(TheData) '为什么呢?我们需要在添加图标的同时,让其返回信息
End With '给主窗体,Or的意思是同时进行设置和返回消息
Shell_NotifyIcon NIM_ADD, TheData '根据前面定义NIM_ADD,设置为“添加模式”
End Sub
' *********************************************
' 删除系统托盘中的图标
' *********************************************
Public Sub RemoveFromTray()
'删除托盘中的图标
With TheData
.UFlags = 0
End With
Shell_NotifyIcon NIM_DELETE, TheData '根据前面定义NIM_DELETE,设置为“删除模式”

'恢复原有的设置
SetWindowLong TheForm.HWnd, GWL_WNDPROC, OldWindowProc
End Sub 
' *********************************************
' 为托盘中的图标加上浮动提示(也就是鼠标移上去时出现的提示字条)
' *********************************************
Public Sub SetTrayTip(tip As String)
With TheData
.SzTip = tip & vbNullChar
.UFlags = NIF_TIP '指明要对浮动提示进行设置
End With
Shell_NotifyIcon NIM_MODIFY, TheData '根据前面定义NIM_MODIFY,设置为“修改模式”
End Sub
' *********************************************
' 设置托盘的图标(在本例中没有用到,如果要动态改变托盘内显示的图标,它非常有用)
' 例如:1、显示动画图标(方法你一定猜到了,对!使用Timer控件,不断调用此过程,注意把动画放在pic数组中)
' 2、程序处于不同状态时,显示不同的图标,方法是类似的
' 有兴趣的话试一试吧。
' *********************************************
Public Sub SetTrayIcon(pic As Picture)
'判断一下pic中存放的是不是图标
If pic.Type <> vbPicTypeIcon Then Exit Sub

'更换图标为pic中存放的图标
With TheData
.HIcon = pic.Handle
.UFlags = NIF_ICON
End With
Shell_NotifyIcon NIM_MODIFY, TheData
End Sub

以上代码保存于: SourceCode Explorer(源代码数据库)
           复制时间: 2002-11-16 01:01
           软件版本: 1.0.753
           软件作者: Shawls
           个人主页: Http://Shawls.Yeah.Net
             E-Mail: ShawFile@163.Net
                 QQ: 9181729

shawls
shawls
等级:
#7 得分:8回复于: 2002-11-16 01:02:50
[名称]           VB托盘程序详解

[语言种类]       Visual Basic

[类别一]         界面

[类别二]         空

[类别三]         空

[数据来源]       未知

[保存时间]       2002-01-05

[关键字一]       API

[关键字二]       托盘

[关键字三]       空

[内容简介]       空

[源代码内容]

很多软件运行时会在系统托盘区(就是桌面右下角显示时间的区域)出现一个小图标,它作为程序运行的一个标志,我们可以通过使用小图标所弹出的菜单来控制应用程序的状态。本例就给出了一个功能比较完整的托盘程序,我们可以看到怎样用API函数Shell_NotifyIcon来添加、删除、更改托盘图标;而且例中还演示了为托盘图标添加右键菜单和浮动提示的方法。

  程序(附后)用到了Shell_NotifyIcon、SendMessage、CallWindowProc、SetWindowLong等API函数,其中Shell_NotifyIcon是主要的函数,它用来添加、删除、更改系统托盘区(taskbar status area)的图标,所以我们先来看看这个函数的声明和参数:

  使用API函数之前必须先在程序中声明如下:

Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long 
 
   
  其中各参数的意义如下表:

参数: 意义 
dwMessage 为消息设置值,它可以是以下的几个常数值:0、1、2 
NIM_ADD = 0  加入图标到系统状态栏中 
NIM_MODIFY = 1  修改系统状态栏中的图标 
NIM_DELETE = 2  删除系统状态栏中的图标

  LpData 用以传入NOTIFYICONDATA数据结构变量,其结构如下所示:

Type NOTIFYICONDATA

  cbSize As Long        需填入NOTIFYICONDATA数据结构的长度
  HWnd As Long         设置成窗口的句柄 
  Uid As Long         为图标所设置的ID值
  UFlags As Long        设置uCallbackMessage,hIcon,szTip是否有效
  UCallbackMessage As Long   消息编号
  HIcon As Long         显示在状态栏上的图标
  SzTip As String * 64     提示信息
End Type

  返回值 Long,非零表示成功,零表示失败

  在使用这个API函数之前我们应该先定义结构类型NOTIFYICONDATA:

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

  然后定义一个NOTIFYICONDATA的变量TheData来记录设置托盘图标的数据

Private TheData As NOTIFYICONDATA

  这时我们就可以使用这个函数来设置系统托盘图标了,具体方法如下:

   1、添加图标

With TheData 
    .Uid = 0
    .HWnd = frm.HWnd       'frm.HWnd是程序主窗体的句柄
    .cbSize = Len(TheData)
    .HIcon = frm.Icon.Handle  'frm.Icon.Handle指向主窗体的图标
    .UFlags = NIF_ICON
    .UCallbackMessage = TRAY_CALLBACK 
     '作用是允许返回消息,在下一节中会有详细解释。
    .UFlags = .UFlags Or NIF_MESSAGE
    .cbSize = Len(TheData)
   End With
   Shell_NotifyIcon NIM_ADD, TheData  
  '根据前面定义NIM_ADD,设置为“添加模式”,然后添加 
   

   2、删去图标

With TheData
    .UFlags = 0
End With 
Shell_NotifyIcon NIM_DELETE, TheData  
'根据前面定义NIM_DELETE,设置为“删除模式” 
    
   3、更改图标

With TheData 
  .HIcon = pic.Handle    
  'pic是图片狂PictureBox,存放图标文件
  .UFlags = NIF_ICON
End With 
Shell_NotifyIcon NIM_MODIFY, TheData 
'根据前面定义NIM_MODIFY,设置为“更改模式” 
    
   4、为图标添加浮动提示信息

With TheData 
    .SzTip = tip & vbNullChar 
      'tip是字符串string,存储提示信息
    .UFlags = NIF_TIP   
    '指明要对浮动提示进行设置 
End With 
Shell_NotifyIcon NIM_MODIFY, TheData 
'根据前面定义NIM_MODIFY,设置为“修改模式”  
   

  通过以上几段代码我们就能根据自己需要添加、删除、更改系统托盘图标,并能添加系统图标上的浮动提示信息。但这时的托盘图标是孤立的,我们并不能利用它来控制应用程序的行为,怎么办呢?别急,请往下看……如果你下载(源程序下载)并运行这个例程序,你会发现如果我们在托盘图标上点击鼠标右键,则会弹出一个右键菜单。如果点击相应的菜单项,程序主窗体会随之变化,这样就可以控制程序的行为。而如果当主窗体处于最小化状态时,我们在托盘图标上点击左键,窗体会恢复到原来的大小。其实实现上述的功能都要依赖于WINDOWS操作系统的消息机制,要完全弄懂这个机制挺不容易的,但是我们可以按下述文字来理解它。

  把WINDOWS操作系统看作人的大脑,它接收、处理、并发送各种各样的信息给我们的各个器官(当然是比喻各个应用程序了),也就是说它是消息的中枢。而每个应用程序(甚至每一个按钮、标签、窗体等等统称为窗口)在运行时都会被分配一个窗口过程WINDOWPROC,由这个窗口过程来接收和处理操作系统发来的消息(实际上存在一个消息队列),通常情况下这个窗口过程是由操作系统指定的,它会自动的响应并处理一些WINDOWS消息(如窗体移动、最大化、最小化、错误信息等)。好,到这我们先停一下,提出一个疑问,这些消息能否由我们自己写程序来处理呢?答案是肯定的,不过还得借助API函数的威力了,怎么用?我们还是先看看这些API函数的定义和参数吧。

  程序中用到了SendMessage、CallWindowProc、SetWindowLong等API函数,其中SendMessage函数的作用是将一条消息发给某个窗口;CallWindowProc函数用来发送消息到一个窗口过程;而使用SetWindowLong函数来为窗口结构中为指定的窗口设置属性。使用API函数之前必须先在程序中声明如下:

 Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

 Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

 Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal HWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long  
 

  其中各参数的意义如下表:

  CallWindowProc函数

参数 意义 
lpPrevWndFunc  Long,原来的窗口过程地址 
HWnd Long,窗口句柄 
Msg Long,发送的消息 
wParam Long,消息类型,参考wParam参数表  
lParam Long,依据wParam参数的不同而不同

  返回值 Long,依据发送的消息不同而变化

  SetWindowLong函数 :

参数 意义 
hwnd  Long,欲为其取得信息的窗口的句柄 
nIndex Long,请参考GetWindowLong函数的nIndex参数的说明 
dwNewLong Long,由nIndex指定的窗口信息的新值

  返回值 Long,指定数据的前一个值

  SendMessage函数 :

参数 意义 
hwnd  Long,要接收消息的那个窗口的句柄 
wMsg Long,消息的标识符 
wParam Long,具体取决于消息 
lParam Any,具体取决于消息

  返回值 Long,由具体的消息决定 
  我们要自己写程序来处理消息,必须先更改窗口的属性,从原来由默认的窗口过程来处理消息变成由我们自己写的消息处理过程来处理消息。方法是使用SetWindowLong函数来取得默认窗口过程的地址,然后转向为我们自己写的窗口过程的地址,具体的实现方法如下代码:

'GWL_WNDPROC获得该窗口的窗口过程的地址,AddressOf是取址函数,NewWindowProc是我们写的过程
OldWindowProc = SetWindowLong(frm.HWnd, GWL_WNDPROC, AddressOf 
               NewWindowProc) 
  
  然后在NewWindowProc函数中写入如下代码,需要注意的是下面代码中红色的TRAY_CALLBACK是由托盘区图标传来的消息,要让托盘图标传回消息,必须在添加托盘图标时指定:

   Public Function NewWindowProc(ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
   '如果用户点击了托盘中的图标,则进行判断是点击了左键还是右键
   If Msg = TRAY_CALLBACK Then 
     '如果点击了左键 
     If lParam = WM_LBUTTONUP Then
      '而这时窗体的状态是最小化时 
       If TheForm.WindowState = vbMinimized Then _ 
        '恢复到最小化前的窗体状态 
          TheForm.WindowState = TheForm.LastState 
          TheForm.SetFocus
          Exit Function
       End If 
     End If 
     '如果点击了右键 
     If lParam = WM_RBUTTONUP Then 
       '则弹出右键菜单 
       TheForm.PopupMenu TheMenu 
       Exit Function 
     End If 
   End If 
   '如果是其他类型的消息则传递给原有默认的窗口函数
   NewWindowProc = CallWindowProc(OldWindowProc, HWnd, Msg, wParam, lParam) 
   End Function  这样我们就取得并处理了来自托盘图标的消息,现在的问题是在鼠标右键菜单弹出后,怎么控制程序主窗体的状态,这时我们需要用到SendMessage函数来向主窗体发送最大化、最小化、关

转:介绍shell_notifyicon,SendMessage,CallWindowProc,GetWindowLong,SetWindowLong的用法的更多相关文章

  1. Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

    Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...

  2. c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  3. 简单介绍移动端CSS3单位rem的用法

    PC端大部份是用px单位,小部分用em单位,而移动端,请全部用rem单位吧.目前大部份设备,包括但不限于iOS 5+.Android 2.3+.Window Phone 8+都是可以兼容的,具体兼容表 ...

  4. Wireshark使用介绍(一):Wireshark基本用法

    抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接口.点击Capture Opti ...

  5. wpf C# 操作DirectUI窗口 SendMessage+MSAA

    原文:wpf C# 操作DirectUI窗口 SendMessage+MSAA 最近做一个抓取qq用户资料的工具,需要获取qq窗口上的消息,以前这种任务是用句柄获取窗口中的信息,现在qq的窗口用的是D ...

  6. Unity3D的LightProbe动态光探头用法介绍

    原地址:http://liweizhaolili.blog.163.com/blog/static/16230744201371721511106/ 之前曾经介绍过Unity3D的LightMappi ...

  7. 阿里云 OCS SDK for NodeJS介绍

    阿里云 OCS SDK for NodeJS介绍 阿里云技术团队:熊亮 阿里云 SDK for NodeJS 是为 NodeJS 开发者提供使用阿里云各项服务的统一入口,由阿里云UED团队负责开发维护 ...

  8. MFC发送自定义消息-PostMessage和SendMessage

    PostMessage:把消息投放到线程的消息队列,不能消息被处理就立即返回SendMessage:消息被处理完后才返回 几种发送消息的写法:   ::PostMessage(GetSafeHwnd( ...

  9. Android项目开发全程(二)--Afinal用法简单介绍

    本篇博文接上篇的<Android项目开发全程(一)--创建工程>,主要介绍一下在本项目中用到的一个很重要的框架-Afinal,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目 ...

随机推荐

  1. 【推导】zoj3981 Balloon Robot

    题意:一个桌子有m个位置(首尾相接),有n支队伍坐在其中的n个位置上.有个机器人会从某个起始位置出发,每个时刻会依次发生以下三个事件: 机器人顺时针转一个单位: 某些队伍通过了题目(如果存在): 如果 ...

  2. 【DLX算法】poj2676 Sudoku

    DLX算法求解精确覆盖问题模板.赛场上可以参见白书. #include<cstdio> #include<cstring> #include<vector> usi ...

  3. WebSQL的基本使用过程

    1.创建或打开数据库(openDatabase) var db = openDatabase('dbname', '1.0', 'discription', 2 * 1024); // 目前测试只有C ...

  4. JDK源码(1.7) -- java.util.AbstractCollection<E>

    java.util.AbstractCollection<E> 源码分析(JDK1.7) ------------------------------------------------- ...

  5. UESTC 2015dp专题 A 男神的礼物 区间dp

    男神的礼物 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descri ...

  6. 《C# to IL》第二章 IL基础

    如果你真的想要理解C#代码,那么最好的方法就是通过理解由C#编译器生成的代码.本章和下面两章将关注于此. 我们将用一个短小的C#程序来揭开IL的神秘面纱,并解释由编译器生成的IL代码.这样,我们就可以 ...

  7. Visual Studio 2015创建Shared Project时出错

    今天使用Visual Studio 2015创建共享项目的时候发现如下错误: 网上搜了一下,发现了同样有人问这个问题的问题:Why can't I create Shared Project in V ...

  8. [0day]基础工具学习

    事实上非常多工具多少都使用的比較熟悉了. 可是仍有一些点还是比較有趣以及我不知道的.毕竟第一章,查缺补漏的. (话说这个成语在高三冲刺的时候,老师用得最多,当时还非常悲哀的一直补东墙.漏西墙.始终认为 ...

  9. java读写锁实现数据同步访问

    锁机制最大的改进之一就是ReadWriteLock接口和它的唯一实现类ReentrantReadWriteLock.这个类有两个锁,一个是读操作锁,另一个是写操作锁.使用读操作锁时可以允许多个线程同时 ...

  10. 【spring boot】启动类启动 错误: 找不到或无法加载主类 com.codingapi.tm.TxManagerApplication 的解决方案

    导入的一个外部的spring boot项目,运行启动类,出现错误:找不到或无法加载主类 com.codingapi.tm.TxManagerApplication 解决方案: 将所有错误处理完成后,再 ...