史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2005-06-22, 12:19 PM   #1
魔術王子
版區管理員
 
魔術王子 的頭像
榮譽勳章
UID - 115097
在線等級: 級別:42 | 在線時長:1994小時 | 升級還需:27小時級別:42 | 在線時長:1994小時 | 升級還需:27小時
註冊日期: 2004-01-13
住址: 魔術學園
文章: 2991
精華: 0
現金: 14977 金幣
資產: 2678607 金幣
預設 用Visual Basic 6.0設計TrayIcon

本程式是參考 王國榮先生 所著的Visual Basic 6.0 Windows API講座
不過有一點遺憾,就是在結束時若以End指令結束會出現錯誤
若按表單的關閉鈕則不會,不知是VB的Bug還是小王子的系統有問題
請建一個選單(名稱:Menu):
Caption = "選單"
Visible = 0 'False
Begin VB.Menu Exit
Caption = "還原"
End
另外再新增一個模組...
Form1.frm內容:
語法:
VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   3195
   ClientLeft      =   165
   ClientTop       =   450
   ClientWidth     =   4680
   LinkTopic       =   "Form1"
   ScaleHeight     =   3195
   ScaleWidth      =   4680
   StartUpPosition =   3  '系統預設值
   Begin VB.Menu Menu 
      Caption         =   "選單"
      Visible         =   0   'False
      Begin VB.Menu Exit 
         Caption         =   "還原"
      End
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Exit_Click()
    SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
    
    ' 刪除圖示
    Dim nid As NOTIFYICONDATA
    
    nid.cbSize = Len(nid)
    nid.hWnd = Me.hWnd
    nid.uID = uID
    Shell_NotifyIcon NIM_DELETE, nid
    Me.Show
End Sub

Private Sub Form_Load()
    prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
    SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
    Dim nid As NOTIFYICONDATA
    
    nid.cbSize = Len(nid)
    nid.hWnd = Me.hWnd
    nid.uID = uID
    nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
    nid.hIcon = Me.Icon
    nid.szTip = "TrayIcon"
    nid.uCallbackMessage = uMessage
    Shell_NotifyIcon NIM_ADD, nid
    Me.Hide
    Exit Sub
End Sub
模組Module1.bas內容:
語法:
Attribute VB_Name = "Module1"
Option Explicit

Public Const GWL_WNDPROC = (-4)
Public Const WM_USER = &H400
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_LBUTTONUP = &H202
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_RBUTTONUP = &H205

Public Const NIM_ADD = 0
Public Const NIM_MODIFY = 1
Public Const NIM_DELETE = 2

Public Const NIF_MESSAGE = 1
Public Const NIF_ICON = 2
Public Const NIF_TIP = 4

Public Const uID = 9998
Public Const uMessage = WM_USER + 100

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

Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) 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 WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If Msg = WM_USER + 100 Then
        If lParam = WM_LBUTTONUP Then
            Form1.WindowState = vbNormal
            Form1.Show
        ElseIf lParam = WM_RBUTTONUP Then
            Form1.PopupMenu Form1.Menu
        End If
    End If
    WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End Function
粗體部分需要自行KeyIn
魔術王子 目前線上  
送花文章: 1530, 收花文章: 1555 篇, 收花: 3894 次
回覆時引用此帖
舊 2005-06-22, 01:38 PM   #2 (permalink)
註冊會員
 
JOVI 的頭像
榮譽勳章
UID - 4637
在線等級: 級別:9 | 在線時長:132小時 | 升級還需:8小時級別:9 | 在線時長:132小時 | 升級還需:8小時級別:9 | 在線時長:132小時 | 升級還需:8小時級別:9 | 在線時長:132小時 | 升級還需:8小時
註冊日期: 2002-12-07
VIP期限: 2008-05
文章: 285
精華: 0
現金: 5633 金幣
資產: 5933 金幣
預設

不用那麼辛苦了,VB.net就有那個功能,只要加入NotifyIcon員件,在設定幾行程式,以前vb6要辛苦的爬程式,現在會輕鬆一點。
JOVI 目前離線  
送花文章: 180, 收花文章: 13 篇, 收花: 84 次
回覆時引用此帖
舊 2005-06-22, 02:02 PM   #3 (permalink)
版區管理員
 
魔術王子 的頭像
榮譽勳章
UID - 115097
在線等級: 級別:42 | 在線時長:1994小時 | 升級還需:27小時級別:42 | 在線時長:1994小時 | 升級還需:27小時
註冊日期: 2004-01-13
住址: 魔術學園
文章: 2991
精華: 0
現金: 14977 金幣
資產: 2678607 金幣
預設

引用:
作者: JOVI
不用那麼辛苦了,VB.net就有那個功能,只要巧w幾行程式,以前vb6要辛苦的爬程式,現在會輕鬆一點。
其實C++ Builder也有
只是小王子認為若真的要打好程式基礎,還是從最基本學起比較好
否則最後只會變成"元件有提供的功能都會用,元件不會的就不會,元件不行的就沒輒了,元件的限制就是你的限制"
魔術王子 目前線上  
送花文章: 1530, 收花文章: 1555 篇, 收花: 3894 次
回覆時引用此帖
舊 2005-06-23, 12:01 AM   #4 (permalink)
長老會員
 
劍痞憶秋年 的頭像
榮譽勳章
UID - 15
在線等級: 級別:31 | 在線時長:1096小時 | 升級還需:56小時級別:31 | 在線時長:1096小時 | 升級還需:56小時級別:31 | 在線時長:1096小時 | 升級還需:56小時級別:31 | 在線時長:1096小時 | 升級還需:56小時級別:31 | 在線時長:1096小時 | 升級還需:56小時級別:31 | 在線時長:1096小時 | 升級還需:56小時
註冊日期: 2002-12-06
住址: 步雲崖
文章: 280
精華: 0
現金: 15847 金幣
資產: 20867 金幣
預設

引用:
作者: 魔術王子
若以End指令結束會出現錯誤
若按表單的關閉鈕則不會,不知是VB的Bug還是小王子的系統有問題
小弟試的結果是,不是系統的問題,該是 Bug 吧!
or 有什麼該釋放的沒釋放!!
__________________
一切有為法 如夢幻泡影
如露亦如電 應作如是觀
劍痞憶秋年 目前離線  
送花文章: 150, 收花文章: 33 篇, 收花: 130 次
回覆時引用此帖
舊 2005-06-23, 06:16 AM   #5 (permalink)
長老會員
榮譽勳章
UID - 548
在線等級: 級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時
註冊日期: 2002-12-06
住址: 桃園
文章: 8606
現金: 1491 金幣
資產: 1183995 金幣
預設

引用:
作者: 劍痞憶秋年
小弟試的結果是,不是系統的問題,該是 Bug 吧!
or 有什麼該釋放的沒釋放!!
語法:
SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
應該是程式還沒將這段訊息改回來時就離開造成的吧
試試加個DoEvxxx(忘了怎麼拼了)

<參考>
__________________
地獄變現記
[人身得來不易,願大家能尊重生命--勿傷胎命][好淫者請好自為之吧--割鳥]
南泉禪師道:
道不屬知,不屬不知。知是妄覺,不知是無記。若真達不疑之道,猶如太虛,廓然蕩豁,豈可強是非邪?」
德山宣鑒禪師:
「如果明白無事,則勿妄求,妄求而得,亦非得也。汝但無事於心,無心於事,則虛而靈,空而妙。若毛端許,言之本末者,皆為自欺。何故?毫氂繫念,三塗業因。瞥爾情生,萬劫羈鎖。聖名凡號,盡是虛聲。殊相劣形,皆是幻色。汝欲求之,得無累乎?」
不知道 目前離線  
送花文章: 5469, 收花文章: 5341 篇, 收花: 24549 次
回覆時引用此帖
舊 2005-06-23, 07:14 AM   #6 (permalink)
版區管理員
 
魔術王子 的頭像
榮譽勳章
UID - 115097
在線等級: 級別:42 | 在線時長:1994小時 | 升級還需:27小時級別:42 | 在線時長:1994小時 | 升級還需:27小時
註冊日期: 2004-01-13
住址: 魔術學園
文章: 2991
精華: 0
現金: 14977 金幣
資產: 2678607 金幣
預設

引用:
作者: 不知道
SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
應該是程式還沒將這段訊息改回來時就離開造成的吧
試試加個DoEvxxx(忘了怎麼拼了)

<參考>
DoEvents
一樣不行
魔術王子 目前線上  
送花文章: 1530, 收花文章: 1555 篇, 收花: 3894 次
回覆時引用此帖
舊 2005-06-23, 07:23 AM   #7 (permalink)
版區管理員
 
魔術王子 的頭像
榮譽勳章
UID - 115097
在線等級: 級別:42 | 在線時長:1994小時 | 升級還需:27小時級別:42 | 在線時長:1994小時 | 升級還需:27小時
註冊日期: 2004-01-13
住址: 魔術學園
文章: 2991
精華: 0
現金: 14977 金幣
資產: 2678607 金幣
預設

語法:
VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   3195
   ClientLeft      =   165
   ClientTop       =   450
   ClientWidth     =   4680
   LinkTopic       =   "Form1"
   ScaleHeight     =   3195
   ScaleWidth      =   4680
   StartUpPosition =   3  '系統預設值
   Begin VB.Menu Menu 
      Caption         =   "選單"
      Visible         =   0   'False
      Begin VB.Menu Exit 
         Caption         =   "離開"
      End
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Exit_Click()
    Unload Me
End Sub

Private Sub Form_Load()
    prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
    SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
    Dim nid As NOTIFYICONDATA
    
    nid.cbSize = Len(nid)
    nid.hWnd = Me.hWnd
    nid.uID = uID
    nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
    nid.hIcon = Me.Icon
    nid.szTip = "TrayIcon"
    nid.uCallbackMessage = uMessage
    Shell_NotifyIcon NIM_ADD, nid
    Me.Hide
    Exit Sub
End Sub

Private Sub Form_Unload(Cancel As Integer)
    SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
    
    ' 刪除圖示
    Dim nid As NOTIFYICONDATA
    
    nid.cbSize = Len(nid)
    nid.hWnd = Me.hWnd
    nid.uID = uID
    Shell_NotifyIcon NIM_DELETE, nid
    Me.Show
End Sub
小王子將End改成Unload Me就行了
大家試試吧
魔術王子 目前線上  
送花文章: 1530, 收花文章: 1555 篇, 收花: 3894 次
回覆時引用此帖
舊 2005-06-23, 09:54 AM   #8 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:97 | 在線時長:9861小時 | 升級還需:135小時級別:97 | 在線時長:9861小時 | 升級還需:135小時級別:97 | 在線時長:9861小時 | 升級還需:135小時級別:97 | 在線時長:9861小時 | 升級還需:135小時級別:97 | 在線時長:9861小時 | 升級還需:135小時級別:97 | 在線時長:9861小時 | 升級還需:135小時級別:97 | 在線時長:9861小時 | 升級還需:135小時
註冊日期: 2002-12-07
文章: 13343
精華: 0
現金: 26452 金幣
資產: 3024312 金幣
預設

像這種問題除錯就要試著 Step除錯 及 利用 Msgbox 來看哪裡是錯誤中斷點
的確 End 不如 Unload ME

End 停止執行,可以放在程序中的任何位置,它可以關閉以 Open 陳述式所開啟的檔案,且可以清除變數。

End (有時)會繞過 Form_Unload 而直接結束程式
mini 目前離線  
送花文章: 2013, 收花文章: 8002 篇, 收花: 26806 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 01:32 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1