• <rp id="wfxtb"><acronym id="wfxtb"></acronym></rp><em id="wfxtb"></em><dd id="wfxtb"><big id="wfxtb"><video id="wfxtb"></video></big></dd>
  • <rp id="wfxtb"></rp>

    <mark id="wfxtb"><center id="wfxtb"></center></mark>

      <rp id="wfxtb"><span id="wfxtb"><u id="wfxtb"></u></span></rp>

      <rp id="wfxtb"><object id="wfxtb"></object></rp>

      注意:訪問本站需要Cookie和JavaScript支持!請設置您的瀏覽器! 打開購物車 查看留言付款方式聯系我們
      初中電子 單片機教材一 單片機教材二
      搜索上次看見的商品或文章:
      商品名、介紹 文章名、內容
      首頁 電子入門 學單片機 免費資源 下載中心 商品列表 象棋在線 在線繪圖 加盟五一 加入收藏 設為首頁
      本站推薦:
      VB6中的任務欄圖標編程
      文章長度[5814] 加入時間[2007/3/23] 更新時間[2025/3/13 13:46:30] 級別[0] [評論] [收藏]

        楊山河

      Windows 9X的桌面任務欄顯示了當前正在運行的任務,并且右下角的任務欄圖標提供了快速訪問對于當前不可見的任務。我們的鼠標單擊或雙擊動作都通過任務欄轉發給相應的窗口,哪怕該應用程序根本看不到(窗口隱藏了),接收到消息的應用程序對用戶的鼠標動作作出反應。例如:我們雙擊代表聲效控制程序的喇叭圖標,將彈出“音量控制”程序。其實,在微軟的正式文檔中稱之為“發射架”,意思是所有對于任務欄圖標的事件都通過“發射”,讓相應的應用程序獲得消息。這是Windows 9X對于Windows 3.X的先進特性,如果我們有必要的話,我們的程序應當盡量符合微軟徽標要求棗任務欄圖標提供了一種訪問必須運行但不必時時展現應用程序的手段,因為所有Windows標準程序都是消息驅動的,而消息的接收必須要求有界面元素存在,但很多的應用并沒有界面元素(因為沒有必要,譬如微軟Windows 98自帶的計劃任務,它不需要每時每刻都開一個桌面窗口,但有時我們需要隨機地訪問它,并且它自己也必須時刻運行),所以如果需要在應用程序窗口不可見情況下訪問這些應用程序的話,必須通過任務欄圖標。

      如果對于C或C++之類的語言,要實現任務欄圖標的編程是很簡單的:在創建應用窗口時通過調用Shell API往任務欄加入圖標,然后隱藏應用窗口,“耐心”傾聽各種鼠標消息,當用戶對任務欄圖標進行鼠標操作時,系統(具體來說是任務欄)將此消息以調用窗體過程的方式傳遞給應用程序,應用程序根據具體的消息決定執行何種操作。顯然,該過程應當在窗體過程棗C/C++的表演場所中完成,但對于VB語言來說就有些“勉為其難”。VB中標準編程流程中不存在什么“窗體過程”,VB中只能對對象進行編程,只能使用對象的方法、屬性等,所以很多的雜志書報提及任務欄編程時舉例都回避了最流行的VB語言例子。實際上,利用VB6提供的先進特性,我們可以實現任務欄的VB編程。

      VB中實現任務欄編程需要了解以下幾點:

      任務欄圖標與VB應用程序、任務欄之間的關系。這個我們剛才大體上已經討論過:任務欄圖標是應VB應用程序的要求由任務欄加入的,刪除、更新等操作均由任務欄管理,但必須VB應用程序“申請”。當VB應用程序不可見時,任務欄圖標代表它接收各種事件,VB應用程序的窗體過程處理事件。
      VB中并沒有提供任務欄編程語句,但我們可以通過API調用來實現。要用到哪些API我們后面將談到。
      VB任務欄圖標編程必須用到窗體“子類化”,要用到直接獲取/設置窗體過程的API,同時也必須獲取窗體過程的地址,這必須用到VB6才提供的操作符“AddressOf”。具體用法見隨后提供的實例。如果想在應用窗體的事件中響應任務欄圖標轉發的事件,結果一定令你失望。窗體的事件同任務欄響應并轉發的事件不是一個概念,前者是OLE 技術中的概念,經過VB技術的“包裹”,后者是真正意義上的事件。在VB中響應任務欄圖標的事件,必須直接“接管”窗體的真正的窗體過程。
      任務欄圖標編程并非必要時就不使用,除了使用過程較復雜、易引起系統崩潰原因外,太多的任務欄圖標影響桌面“市容”也是一個原因。
      下面,我們通過一個簡單的實例來說明這個過程。我們的這個例子很簡單,就是在一個標準的工程的Form1裝入之前往任務欄加入一個圖標,裝入窗體后利用子類化技術截取發往窗體的消息,在鼠標左鍵雙擊事件中發出一個消息框表明消息的確轉發到應用程序。

      首先,將應用程序的啟動過程設為Sub main( ),這可以通過選擇project/project1 properties,在彈出的general表中,從startup object項中選擇 “sub main”。

      其二,往工程中加入一個模塊。往其中加入任務欄圖標編程需要的數據結構、常量、API聲名。為此,需要啟動API Text Viewer。

      需要加入的數據結構為(相應的意義見注釋):

      Public Type NOTIFYICONDATA

      cbSize As Long ‘本結構的長度

      hWnd As Long ‘往任務欄安裝圖標的應用程序的窗體句柄,系統據此發送消息給相應的應用程序

      uID As Long ‘圖標的唯一標識,由安裝圖標的應用程序確定

      uFlags As Long ‘圖標將接受或表現什么樣的行為

      uCallbackMessage As Long ‘發給應用程序的回調消息,應當避免同系統預定義消息相同,應當值大于 WM_USER

      hIcon As Long ‘圖標句柄,即欲在任務欄中顯示的圖標

      szTip As String * 64 ‘如果圖標被允許顯示 Tip的話,那么當鼠標停留在任務欄中的圖標上一段時間,將顯示該串

      End Type

      需要加入的常量聲名有:

      Public Const WM_LBUTTONDBLCLK = &H203 ‘鼠標左鍵雙擊消息的代碼

      Public Const WM_USER = &H400 ‘用戶自定義消息的基值

       

      Public Const GWL_WNDPROC = (-4) ‘子類化窗體過程時,必須使用此參數確定需要替換的窗體類結構中的窗體過程的偏移值。

      Public Const NIM_ADD = &H0 ‘表示要往任務欄中加入圖標

      Public Const NIM_DELETE = &H2 ‘刪除圖標

      Public Const NIM_MODIFY = &H1 ‘修改圖標

      Public Const NIF_ICON = &H2 ‘允許圖標顯示

      Public Const NIF_MESSAGE = &H1 ‘允許圖標消息轉發

      Public Const NIF_TIP = &H4 ‘允許圖標顯示圖標提示內容串

       

      Public Const uID& = 88888 ‘由你自定義的圖標的標識值

      Public Const cbNotify& = WM_USER + 100 ‘圖標轉發的回調消息,必須大于 WM_USER

       

      用到的API有:

      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 ‘

      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 ShellNotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

      ‘此函數用于往任務欄中加入指定的圖標,用到了前面提到的NOTIFYICONDATA數據結構。

      用到變量有:

      Global gHW As Long ‘用于保存VB應用程序的窗口句柄

      Global lpPrevWndProc As Long ‘保存被替換前的窗體過程地址

      Public myNID As NOTIFYICONDATA ‘用于給定圖標的有關信息

      還應當設計好函數和窗體,具體見注釋:

      Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal

      lParam As Long) As Long ‘此函數截取了所有的發往窗體的消息

      If wParam = uID Then ‘如果消息參數中輔助參數是我們自定義的值,則表明此消息是經任務欄圖標轉發的

      Select Case lParam ‘此參數表明發生了何種事件,如果雙擊了右鍵的話就彈出一個消息框

      Case WM_LBUTTONDBLCLK

      MsgBox "已經轉發了鼠標雙擊消息!" , vbInformation, "任務欄圖標編程"

      Form1.Show ‘顯示窗體

      End Select

      End If

      WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) ‘調用原來的窗體過程

      End Function

       

      Public Sub Hook() ‘用于子類化窗體,讓自編的函數截取消息,此Sub設定新窗體過程

      lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)

      End Sub

       

      Sub unHook() ‘解除自定義窗體過程

      Dim temp As Long

      temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)

      End Sub

       

      Public Sub main()

      Load Form1 ‘僅需要裝入窗體即可

      End Sub

       

      下面,我們來看看如何在Form1中處理圖標的加入等問題。

      在Form_Load()中輸入以下代碼:

      Private Sub Form_Load()

      gHW = Me.hWnd ‘初始化全局變量

      myNID.cbSize = Len(myNID) ‘填充myNID

      myNID.hIcon = Me.Icon

      myNID.hWnd = gHW

      myNID.szTip = "我的應用程序圖標"

      myNID.uCallbackMessage = cbNotify

      myNID.uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP

      myNID.uID = uID

      ShellNotifyIcon NIM_ADD, myNID ‘加入任務欄圖標

      Hook ‘設置新的窗體過程

      End Sub

      在窗體的卸載過程中,需要撤除圖標以及解除截取窗體的過程。

      Private Sub Form_Unload(Cancel As Integer)

      ShellNotifyIcon NIM_DELETE, myNID ‘刪除任務欄圖標

      UnHook ‘解除掛鉤

      End Sub

      好了,現在你可以保存工程,然后運行。你可以看到任務欄“發射架”中加入了一個普通的窗體圖標,那就是你“親手”加入的。你可以雙擊它,看會發生什么。如果沒有一個消息框彈出,或者系統崩潰,說明你在輸入代碼時有誤,請仔細研讀本例代碼。

      最后,我們來總結以下整個過程需要注意什么:

      WindowProc函數(新窗體過程)必須在.Bas 模塊中聲名,且參數必須正確,函數中不允許出現任何錯誤(不管是語法上的還是邏輯上的)。此函數的最后必須調用原來的窗體過程,否則的話...(會讓你死得很難看!!!)
      調試時,如果要終止應用程序,請不要使用VB的調試按鈕,只能使用窗體的關閉按鈕,否則的話,由于失效的指針使用將會使VB崩潰。
      子類化技術使你可以自如截取窗體消息,功能強大,但注意不可濫用,畢竟它有許多副作用。
      由于VB的限制,我們只能通過Windows API方式來完成一些特殊任務。使用API,需要注意 API參數的正確以及在哪個模塊聲明。
      本例對于任務欄圖標轉發的消息作出的反映很簡單,僅起“Demo”作用,你可以加入許多你自己的想法棗試試吧,我等著你的好消息!

      1、 本站不保證以上觀點正確,就算是本站原創作品,本站也不保證內容正確。
      2、如果您擁有本文版權,并且不想在本站轉載,請書面通知本站立即刪除并且向您公開道歉! 以上可能是本站收集或者轉載的文章,本站可能沒有文章中的元件或產品,如果您需要類似的商品請 點這里查看商品列表!
      本站協議。 版權信息。 關于我們。 本站地圖。 營業執照。 發票說明。 付款方式。 聯系方式
      深圳市寶安區西鄉五壹電子商行——粵ICP備16073394號-1;地址:深圳西鄉河西四坊183號;郵編:518102
      E-mail:51dz$163.com($改為@);Tel:(0755)27947428
      工作時間:9:30-12:00和13:30-17:30和18:30-20:30,無人接聽時可以再打手機13537585389
      91嫩草黄片动漫版