Option ExplicitPrivate 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 TypePrivate Type POINTAPI X As Long Y As Long End TypePrivate Type RECT Left As Long Top As Long Right As Long Bottom As Long End TypePrivate Type TPMPARAMS cbSize As Long rcExclude As RECT End TypePrivate Const NIF_MESSAGE = &H1 Private Const NIF_ICON = &H2 Private Const NIF_TIP = &H4Private Const NIM_ADD = &H0 Private Const NIM_MODIFY = &H1 Private Const NIM_DELETE = &H2Private Const TPM_LEFTALIGN = &H0& Private Const TPM_RIGHTBUTTON = &H2&Private Const WM_MOUSEMOVE = &H200 Private Const WM_LBUTTONDOWN = &H201 Private Const WM_LBUTTONUP = &H202 Private Const WM_LBUTTONDBLCLK = &H203 Private Const WM_RBUTTONDOWN = &H204 Private Const WM_RBUTTONUP = &H205 Private Const WM_RBUTTONDBLCLK = &H206 Private Const WM_USER = &H400 Private Const WM_NOTIFYICON = WM_USER + &H100 Private Const WM_COMMAND = &H111 Private Const WM_DESTROY = &H2 Private Const WM_DRAWITEM = &H2B Private Const WM_INITDIALOG = &H110 Private Const WM_PAINT = &HF Private Const WM_MENUSELECT = &H11F Private Const WM_ENDSESSION = &H16 Private Const WM_QUERYENDSESSION = &H11Private Const SCK_MSG = 1025Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function TrackPopupMenuEx Lib "user32" (ByVal hMenu As Long, ByVal un As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal hwnd As Long, lpTPMParams As TPMPARAMS) As Long Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long Private 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 Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPrivate Const GWL_WNDPROC = (-4)Dim SMenu As Long Dim lProc As LongPrivate mvarfrmMenuTarget As FormPublic Property Set frmMenuTarget(ByVal vData As Form) Set mvarfrmMenuTarget = vData End PropertyPublic Property Get frmMenuTarget() As Form Set frmMenuTarget = mvarfrmMenuTarget End Property'隐藏主程序窗口 Public Sub FormHide() frmMenuTarget.Hide AddIcon MenuGet End Sub'打开主程序窗口 Public Sub FormShow() DelIcon frmMenuTarget.Show '显示主窗体 End Sub'获得菜单句柄 Private Sub MenuGet() Dim CMenu As Long CMenu = GetMenu(frmMenuTarget.hwnd) '得到窗体菜单(系统托盘菜单专用窗体) SMenu = GetSubMenu(CMenu, 0) End Sub'添加系统栏图标 Private Sub AddIcon() Const GWL_WNDPROC = (-4) '替换窗口处理函数 Dim NData As NOTIFYICONDATA
Shell_NotifyIcon NIM_ADD, NData lProc = SetWindowLong(frmMenuTarget.hwnd, GWL_WNDPROC, AddressOf DialogProc) End Sub'删除系统栏图标 Private Sub DelIcon() Dim NData As NOTIFYICONDATA Dim RetProc As Long
Shell_NotifyIcon NIM_DELETE, NData SetWindowLong frmMenuTarget.hwnd, GWL_WNDPROC, lProc End Sub'该函数为TaskForm的窗口处理函数。 Private Function DialogProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim MPos As POINTAPI Dim TPM As TPMPARAMS
Select Case uMsg' Case SCK_MSG '处理网络传输 'ProcessMessage wParam, lParam' Case WM_INITDIALOG ' Case WM_COMMAND ' Case WM_DRAWITEM ' Case WM_DESTROY
Case WM_ENDSESSION '系统即将关闭 FormShow '处理退出 Case WM_QUERYENDSESSION FormShow '处理退出 Case WM_NOTIFYICON '有鼠标事件产生 Select Case lParam Case WM_LBUTTONUP FormShow Case WM_RBUTTONUP If SMenu Then '获得光标位置 GetCursorPos MPos '在光标位置处弹出菜单 TPM.cbSize = Len(TPM) TPM.rcExclude.Left = MPos.X TPM.rcExclude.Top = MPos.Y TrackPopupMenuEx SMenu, (TPM_LEFTALIGN Or TPM_RIGHTBUTTON), MPos.X, MPos.Y, frmMenuTarget.hwnd, TPM End If ' Case WM_LBUTTONDOWN ' Case WM_RBUTTONDOWN ' Case WM_LBUTTONDBLCLK ' Case WM_MOUSEMOVE Case Else '其它项交给系统处理 DialogProc = DefWindowProc(hwnd, uMsg, wParam, lParam) End Select Case Else DialogProc = CallWindowProc(lProc, hwnd, uMsg, wParam, lParam) End Select End Function 你要的是这个吧? 复制上面的代码保存成 *.bas MenuTarget 是你要加入托盘的Form 调用 FormShow FormHide显示或还原
但是我的目的是:让一个正常运行的窗体 他的这个属性Me.WindowState = 0 是默认的不变 但是我将这个窗体 最小化 后 再点击 他在桌面上的图标让他 重窗体任务栏的最小化窗体 还原到刚才 我刚才将他最小化的位置 并激活 就像芊芊静听一样 最小化后 在点它在桌面上的图标 将其激活 并在桌面上打开!!!!!!!!!!!!
求求各位了!!!!!
WindowState = 0 是默认,但不是不变的,
窗体 最小化 后,WindowState 就变成 1 了
这时“窗体重任务栏返回桌面”,就是WindowState由 1 变回 0你的意思好像是要防止重运行,并激活自己前一个实例?
App.PrevInstance可以帮你一点忙,但并不可靠,且不能达到你的这个要求。用FindWindow与ShowWindow更好一些。找找相关API帮助,自己学着写会更有好处的。
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End TypePrivate Type POINTAPI
X As Long
Y As Long
End TypePrivate Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePrivate Type TPMPARAMS
cbSize As Long
rcExclude As RECT
End TypePrivate Const NIF_MESSAGE = &H1
Private Const NIF_ICON = &H2
Private Const NIF_TIP = &H4Private Const NIM_ADD = &H0
Private Const NIM_MODIFY = &H1
Private Const NIM_DELETE = &H2Private Const TPM_LEFTALIGN = &H0&
Private Const TPM_RIGHTBUTTON = &H2&Private Const WM_MOUSEMOVE = &H200
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_USER = &H400
Private Const WM_NOTIFYICON = WM_USER + &H100
Private Const WM_COMMAND = &H111
Private Const WM_DESTROY = &H2
Private Const WM_DRAWITEM = &H2B
Private Const WM_INITDIALOG = &H110
Private Const WM_PAINT = &HF
Private Const WM_MENUSELECT = &H11F
Private Const WM_ENDSESSION = &H16
Private Const WM_QUERYENDSESSION = &H11Private Const SCK_MSG = 1025Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function TrackPopupMenuEx Lib "user32" (ByVal hMenu As Long, ByVal un As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal hwnd As Long, lpTPMParams As TPMPARAMS) As Long
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private 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
Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPrivate Const GWL_WNDPROC = (-4)Dim SMenu As Long
Dim lProc As LongPrivate mvarfrmMenuTarget As FormPublic Property Set frmMenuTarget(ByVal vData As Form)
Set mvarfrmMenuTarget = vData
End PropertyPublic Property Get frmMenuTarget() As Form
Set frmMenuTarget = mvarfrmMenuTarget
End Property'隐藏主程序窗口
Public Sub FormHide()
frmMenuTarget.Hide
AddIcon
MenuGet
End Sub'打开主程序窗口
Public Sub FormShow()
DelIcon
frmMenuTarget.Show '显示主窗体
End Sub'获得菜单句柄
Private Sub MenuGet()
Dim CMenu As Long
CMenu = GetMenu(frmMenuTarget.hwnd) '得到窗体菜单(系统托盘菜单专用窗体)
SMenu = GetSubMenu(CMenu, 0)
End Sub'添加系统栏图标
Private Sub AddIcon()
Const GWL_WNDPROC = (-4) '替换窗口处理函数
Dim NData As NOTIFYICONDATA
NData.cbSize = Len(NData)
NData.hwnd = frmMenuTarget.hwnd
NData.uID = 1
NData.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
NData.uCallbackMessage = WM_NOTIFYICON
NData.hIcon = frmMenuTarget.Icon
NData.szTip = "天恩计件工资" & Chr$(0)
Shell_NotifyIcon NIM_ADD, NData
lProc = SetWindowLong(frmMenuTarget.hwnd, GWL_WNDPROC, AddressOf DialogProc)
End Sub'删除系统栏图标
Private Sub DelIcon()
Dim NData As NOTIFYICONDATA
Dim RetProc As Long
NData.cbSize = Len(NData)
NData.hwnd = frmMenuTarget.hwnd
NData.uID = 1
Shell_NotifyIcon NIM_DELETE, NData
SetWindowLong frmMenuTarget.hwnd, GWL_WNDPROC, lProc
End Sub'该函数为TaskForm的窗口处理函数。
Private Function DialogProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim MPos As POINTAPI
Dim TPM As TPMPARAMS
Select Case uMsg' Case SCK_MSG
'处理网络传输
'ProcessMessage wParam, lParam' Case WM_INITDIALOG
' Case WM_COMMAND
' Case WM_DRAWITEM
' Case WM_DESTROY
Case WM_ENDSESSION '系统即将关闭
FormShow
'处理退出
Case WM_QUERYENDSESSION
FormShow
'处理退出
Case WM_NOTIFYICON '有鼠标事件产生
Select Case lParam
Case WM_LBUTTONUP
FormShow
Case WM_RBUTTONUP
If SMenu Then
'获得光标位置
GetCursorPos MPos
'在光标位置处弹出菜单
TPM.cbSize = Len(TPM)
TPM.rcExclude.Left = MPos.X
TPM.rcExclude.Top = MPos.Y
TrackPopupMenuEx SMenu, (TPM_LEFTALIGN Or TPM_RIGHTBUTTON), MPos.X, MPos.Y, frmMenuTarget.hwnd, TPM
End If
' Case WM_LBUTTONDOWN
' Case WM_RBUTTONDOWN
' Case WM_LBUTTONDBLCLK
' Case WM_MOUSEMOVE
Case Else '其它项交给系统处理
DialogProc = DefWindowProc(hwnd, uMsg, wParam, lParam)
End Select
Case Else
DialogProc = CallWindowProc(lProc, hwnd, uMsg, wParam, lParam)
End Select
End Function
你要的是这个吧?
复制上面的代码保存成 *.bas
MenuTarget 是你要加入托盘的Form
调用 FormShow FormHide显示或还原