找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5118|回复: 1

[原创] 在任务栏上弹出自定义菜单

[复制链接]

11

主题

36

回帖

0

精华

铂金会员

积分
1417
发表于 2010-9-19 10:42:40 | 显示全部楼层 |阅读模式
本帖最后由 ljl88900 于 2010-9-19 10:56 编辑

      应用程序启动后,如果你在任务栏上右键单击该程序项,就会弹出系统默认的菜单(还原、移动...关闭)。如果你有特殊需要,就必须定制自己的菜单:

一、把下面代码复制到模块中:

  1. Option Explicit

  2. Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  3. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  4. Private Const GWL_STYLE = (-16)
  5. Private Const WS_SYSMENU = &H80000
  6. Private Const WS_MINIMIZEBOX = &H20000
  7. Private Const GWL_WNDPROC = (-4)

  8. 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
  9. Private Const WM_SYSCOMMAND = &H112
  10. Private Const SC_CLOSE = &HF060&
  11. Private Const WM_CLOSE = &H10
  12. Private Const WM_DESTROY = &H2
  13. Private Const WM_LBUTTONDOWN = &H201
  14. Private Const WM_LBUTTONUP = &H202
  15. Private Const WM_RBUTTONDOWN = &H204
  16. Private Const WM_RBUTTONUP = &H205

  17. 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

  18. Private Type POINT
  19. x As Long
  20. y As Long
  21. End Type
  22. Private Const MF_ENABLED = &H0&
  23. Private Const MF_SEPARATOR = &H800&
  24. Private Const MF_STRING = &H0&
  25. Private Const TPM_RIGHTBUTTON = &H2&
  26. Private Const TPM_LEFTALIGN = &H0&
  27. Private Const TPM_NONOTIFY = &H80&
  28. Private Const TPM_RETURNCMD = &H100&
  29. Private Declare Function CreatePopupMenu Lib "user32" () As Long
  30. Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal sCaption As String) As Long
  31. Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As Long, ByVal hwnd As Long, nIgnored As Long) As Long
  32. Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long
  33. Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINT) As Long
  34. Private Declare Function GetForegroundWindow Lib "user32" () As Long
  35. Private Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
  36. Public SelMenuCaption As String
  37. Dim mlOldproc As Long

  38. Public Function Popup(param() As String) As Long
  39. Dim iMenu As Long
  40. Dim hMenu As Long
  41. Dim nMenus As Long
  42. Dim p As POINT
  43. GetCursorPos p
  44. hMenu = CreatePopupMenu()
  45. nMenus = 1 + UBound(param)
  46. For iMenu = 1 To nMenus
  47. If Trim$(CStr(param(iMenu - 1))) = "-" Then
  48. AppendMenu hMenu, MF_SEPARATOR, iMenu, ""
  49. Else
  50. AppendMenu hMenu, MF_STRING + MF_ENABLED, iMenu, CStr(param(iMenu - 1))
  51. End If
  52. Next iMenu
  53. iMenu = TrackPopupMenu(hMenu, TPM_RIGHTBUTTON + TPM_LEFTALIGN + TPM_NONOTIFY + TPM_RETURNCMD, p.x, p.y, 0, GetForegroundWindow(), 0)
  54. Dim result As Long
  55. Dim buffer As String
  56. Const MF_BYPOSITION = &H400&
  57. buffer = Space(255)
  58. result = GetMenuString(hMenu, (iMenu - 1), buffer, _
  59. Len(buffer), MF_BYPOSITION)
  60. SelMenuCaption = LeftB(buffer, result)
  61. DestroyMenu hMenu
  62. Popup = iMenu
  63. End Function

  64. Private Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  65. Select Case Msg
  66. Case WM_SYSCOMMAND
  67. If wParam = SC_CLOSE Then
  68. SendMessage hwnd, WM_CLOSE, ByVal 0&, ByVal 0&
  69. End If
  70. Case WM_DESTROY
  71. SetWindowLong hwnd, GWL_WNDPROC, mlOldproc
  72. End Select


  73. If Msg = 787 And wParam = 0 Then
  74. '以下是自定义菜单,请根据实际修改

  75. Dim lMenuChosen As Long, s(1) As String

  76. s(0) = "关于..."
  77. s(1) = "关闭"
  78. lMenuChosen = Popup(s)

  79. Select Case lMenuChosen
  80. Case 1
  81. MsgBox "版权所有,侵权必究!", vbInformation, "关于"
  82. Case 2
  83. SendMessage hwnd, &H10, 0, 0 '关闭窗口
  84. End Select
  85. Exit Function
  86. End If

  87. WndProc = CallWindowProc(mlOldproc, hwnd, Msg, wParam, lParam)
  88. End Function

  89. Public Sub subclass(hwnd As Long)
  90. Dim lStyle As Long
  91. lStyle = GetWindowLong(hwnd, GWL_STYLE)
  92. lStyle = lStyle Or WS_MINIMIZEBOX Or WS_SYSMENU
  93. SetWindowLong hwnd, GWL_STYLE, lStyle
  94. mlOldproc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WndProc)
  95. End Sub
复制代码


二、调用举例:
Private Sub Form_Load()
subclass Me.hwnd
End Sub
1.GIF

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-9-20 16:06:02 | 显示全部楼层
支持一下。

要是能显示图标就更好了:)
我就是嗷嗷叫的老马了......

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表