WinApi高手请注意

abomb 2000-05-23 07:05:00
在vb编程中如何将窗体最小化到系统托盘,又如何响应如单击、右键等事件
...全文
186 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Janven 2000-05-26
  • 打赏
  • 举报
回复
hualei:

你的口气简直在侮辱我的程序,这是我不能容忍的。Abomb的做法也非常使人生气。
另外,我对你和Abomb的关系表示怀疑,你的分数都是他给的,我会向Zdg反映这个问题的。(你在线时分数才)
希望你能够也发给我一份,让我见识一下你的程序,如果真象你说的那么好,我会收回我说的话,并在CSDN上向你公开道歉。
flylt 2000-05-26
  • 打赏
  • 举报
回复
把HuaLei的方法公布!!!
flylt 2000-05-26
  • 打赏
  • 举报
回复
我同意Janven的意见!!!!
Janven 2000-05-26
  • 打赏
  • 举报
回复
你24号在线分数才35分,以前ABOMB也好象给过你分
Janven 2000-05-24
  • 打赏
  • 举报
回复
这是我一段相关程序,你改改吧

在标准模块中加入
Public Const WM_USER = &H400
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONUP = &H205

Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd 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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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
Public prevWndProc As Long


Function WndProcCtrl(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
WndProcCtrl = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
If Msg = WM_USER + 100 Then
If lParam = WM_LBUTTONDBLCLK Then
frmCtrlMain.WindowState = vbNormal
frmCtrlMain.Show
ElseIf lParam = WM_RBUTTONUP Then
frmMenu.mnuMain.Visible = True
SetForegroundWindow hwnd
frmCtrlMain.PopupMenu frmMenu.mnuMediaCtrl
End If
End If

End Function

在Form_Load中加入
prevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf WndProcCtrl
在Form_Unload中加入
SetWindowLong Me.hwnd, GWL_WNDPROC, prevWndProc


Asima 2000-05-24
  • 打赏
  • 举报
回复
flylt的例子有误
添加图标时必须设置
niData.cbSize = lenb(niData)
还有
niData.uFlags = NIF_ICON
至少要包含 NIF_ICON
要处理消息还必须包含 NIF_MESSAGE
flylt 2000-05-24
  • 打赏
  • 举报
回复
哈,我刚作了一个给你 !
FormMain
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
'the value of X will vary depending upon the scalemode setting
If Me.ScaleMode = vbPixels Then
msg = X
Else
msg = X / Screen.TwipsPerPixelX
End If

Select Case msg
Case WM_LBUTTONUP '514 restore form window
Me.WindowState = vbNormal
If Me.Visible = False Then
ChangeTaskIcon (frmSplash.icon)
Me.Show
Else
ChangeTaskIcon (Me.icon)
Me.Hide
End If
Case WM_LBUTTONDBLCLK '515 restore form window
Me.WindowState = vbNormal
If Me.Visible = False Then
ChangeTaskIcon (frmSplash.icon)
Me.Show
Else
ChangeTaskIcon (Me.icon)
Me.Hide
End If
Case WM_RBUTTONUP '517 display popup menu
If Me.Visible Then
popmnuShow.Enabled = False
Else
popmnuShow.Enabled = True
End If
Me.PopupMenu popmnuTaskTop
End Select
End Sub
modMain
Option Explicit
'定义常量
Public Const NIF_ICON = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIM_DELETE = &H2
Public Const NIM_MODIFY = &H1
Public Const WM_USER = &H400
Public Const WM_MOUSEMOVE = &H200
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_RBUTTONUP = &H205
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
'定义任务栏图标数据结构
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
'声明“Shell_NotifyIconA”函数
Public Declare Function Shell_NotifyIconA Lib "SHELL32" _
(ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Integer
'声明“GetUserName”函数
Public Declare Function GetUserName Lib "advapi32.dll" _
Alias "GetUserNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long

Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function GetWindowText& Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long)
Public Declare Function GetWindowTextLength& Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long)
Public Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Public g_colEnumWindows As New Collection
Public Const SW_SHOWMAXIMIZED = 3
Public Const SW_SHOWNORMAL = 1
Public Const SW_SHOW = 5

'声明其他变量、对象
Public niData As NOTIFYICONDATA
Public mainForm As New frmMain

'当前系统用户
Public CurrentUserName As String
Public CurrentServerName As String
Public Interval As Integer
Public IsChecked As Boolean


Public Sub ShowTaskIcon(hwnd As Long, hIcon As Long)
niData.hwnd = hwnd
niData.hIcon = hIcon
Shell_NotifyIconA NIM_ADD, niData
End Sub

Public Sub HideTaskIcon()
Shell_NotifyIconA NIM_DELETE, niData
End Sub

Public Sub ChangeTaskIcon(icon As Long)
niData.hIcon = icon
Shell_NotifyIconA NIM_MODIFY, niData
End Sub

当然这只是程序中的一部分,菜单等你自己加上。
Asima 2000-05-24
  • 打赏
  • 举报
回复
这个问题需要用到的有Shell_NotifyIcon()函数和NOTIFYICONDATA结构
函数的第一个参数是NIM_ADD,NIM_DELETE ,NIM_MODIFY
分别表示添加,删除,改变系统托盘区的图标。
NOTIFYICONDATA结构如下
typedef struct _NOTIFYICONDATA { // nid
DWORD cbSize;//结构大小
HWND hWnd; //接受消息的窗体
UINT uID; //id
UINT uFlags; //NIF_ICON ,NIF_MESSAGE,NIF_TIP
//分别表示图标有效,消息有效和鼠标移动到图标上时的提示有效
UINT uCallbackMessage; //程序定义的消息id,它将发送该消息给应用程序
HICON hIcon;//图标句柄
char szTip[64]; //提示信息
} NOTIFYICONDATA, *PNOTIFYICONDATA;

thriller 2000-05-24
  • 打赏
  • 举报
回复
vb5光盘上有示例。
hualei 2000-05-24
  • 打赏
  • 举报
回复
笨蛋才用这种方法,程序我给你发过去了,看看合不合用

1,485

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧