国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
HOW TO:將程序窗口嵌入到任務(wù)欄中

HOW TO:將程序窗口嵌入到任務(wù)欄中

分類: VB.NET 158人閱讀 評論(3) 收藏 舉報(bào)

      今天我們來看看VB.NET怎樣將程序窗口嵌入到任務(wù)欄(Taskbar)中,下圖是我們實(shí)現(xiàn)的效果。


      開始之前,小孟先簡單介紹一下任務(wù)欄的組成,在這里小孟只介紹與我們的程序有關(guān)的部分。整個(gè)任務(wù)欄是有一個(gè)大的窗口容器(該容器類名是Shell_TrayWnd)和一些窗口共同組成的,在這個(gè)類名是Shell_TrayWnd的容器中,有一個(gè)類名是ReBarWindow32的二級容器。這個(gè)二級容器中包含的窗口在Win7和WinXP中是不同的(小孟使用的Win7,不過在這個(gè)程序中Win7和WinXP的效果都是一樣的)。在WinXP中,包含一個(gè)類名是MSTaskSwWClass的窗口外,這個(gè)窗口就是來顯示任務(wù)欄按鈕的(就是顯示你打開了哪些窗口的那個(gè)區(qū)域,在這里小孟叫他最小化窗口),還包含快速啟動(dòng)欄(在左側(cè)以小圖標(biāo)顯示,單擊后會啟動(dòng)相應(yīng)程序的那個(gè)區(qū)域);在Win7中只有一個(gè)類名是MSTaskSwWClass的窗口,因?yàn)閃in7中沒有快速啟動(dòng)欄,雖然左側(cè)也有一個(gè)類似快速啟動(dòng)的區(qū)域,但那個(gè)并不是快速啟動(dòng),而是屬于最小化窗口的一部分。以上就是與我們程序有關(guān)的任務(wù)欄組成了,小孟這表達(dá)能力很有限,大家可能看不懂,so 小孟在下面貼了一張圖。

=====================================================================================

Win7:


    紅色區(qū)域:類名是Shell_TrayWnd的容器                       黃色區(qū)域:類名是ReBarWindow32的二級容器

   綠色區(qū)域:類名是MSTaskSwWClass的窗口

WinXP:


    紅色區(qū)域:紅色區(qū)域——類名是Shell_TrayWnd的容器          黃色區(qū)域:類名是ReBarWindow32的二級容器

    綠色區(qū)域:快速啟動(dòng)區(qū)域                                                 紫色窗口:類名是MSTaskSwWClass的窗口

=====================================================================================

      任務(wù)欄組成我們介紹完了,下面我們說說大體的思路。首先,我們要最小化窗口的width縮短,來給我們的程序騰出地方;然后,將我們的程序設(shè)置成任務(wù)欄的子窗口,以便于嵌入任務(wù)欄;最后,調(diào)整程序的大小和在任務(wù)欄中的位置。

準(zhǔn)備工作做了這么多,下面正式開工。

新建一個(gè)【W(wǎng)indows窗體應(yīng)用程序】。將窗體BorderStyle屬性改成None來把窗體的邊框去掉。然后在窗體上添加一個(gè)文本框,如下圖所示:


下面開始寫代碼。

我們先把程序需要用到的API和structure來聲明一下(先在類外面加上ImportsSystem.Runtime.InteropServices):

  1. '尋找窗口列表中第一個(gè)符合指定條件的頂級窗口  
  2.  Private Declare Function FindWindow Lib "user32" _  
  3.                  Alias "FindWindowA" (ByVal lpClassName As String, _  
  4.                                       ByVal lpWindowName As StringAs Integer  
  5.   
  6.  '在窗口列表中尋找與指定條件相符的第一個(gè)子窗口  
  7.  Private Declare Function FindWindowEx Lib "user32" _  
  8.                  Alias "FindWindowExA" (ByVal hWnd1 As Integer, _  
  9.                                         ByVal hWnd2 As Integer, _  
  10.                                         ByVal lpsz1 As String, _  
  11.                                         ByVal lpsz2 As StringAs Integer  
  12.   
  13.  '指定一個(gè)窗口的新父  
  14.  Private Declare Function SetParent Lib "user32" _  
  15.                  Alias "SetParent" (ByVal hWndChild As Integer, _  
  16.                                     ByVal hWndNewParent As IntegerAs Integer  
  17.   
  18.  '改變指定窗口的位置和大小。頂級窗口可能受最大或最小尺寸的限制,那些尺寸優(yōu)先于這里設(shè)置的參數(shù)  
  19.  Private Declare Function MoveWindow Lib "user32" _  
  20.                  Alias "MoveWindow" (ByVal hWnd As IntPtr, _  
  21.                                      ByVal x As Integer, _  
  22.                                      ByVal y As Integer, _  
  23.                                      ByVal nWidth As Integer, _  
  24.                                      ByVal nHeight As Integer, _  
  25.                                      ByVal bRepaint As IntegerAs Integer  
  26.   
  27.  '獲得整個(gè)窗口的范圍矩形,窗口的邊框、標(biāo)題欄、滾動(dòng)條及菜單等都在這個(gè)矩形內(nèi)  
  28.  Private Declare Function GetWindowRect Lib "user32" _  
  29.                  Alias "GetWindowRect" (ByVal hWnd As IntPtr, _  
  30.                                         ByRef lpRect As RECT) As Integer  
  31.   
  32.  <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _  
  33.  Private Structure RECT  
  34.      Public Left As Integer  
  35.      Public Top As Integer  
  36.      Public Right As Integer  
  37.      Public Bottom As Integer  
  38.  End Structure  

      為了方便調(diào)試,我們先添加程序退出的代碼:

  1. Private Sub cmdTextBox_KeyPress(ByVal sender As ObjectByVal e As _  
  2.                                 System.Windows.Forms.KeyPressEventArgs) _  
  3.                                 Handles cmdTextBox.KeyPress  
  4.     If e.KeyChar = Chr(13) Then  
  5.         If UCase(cmdTextBox.Text) = "END" Then  
  6.             Me.Close()  
  7.         End If  
  8.     End If  
  9. End Su  

      這樣,我們就可以通過在文本框里輸入“end”,然后按回車來退出程序了。

      既然要改變最小化窗口的width,那么我們就先來找最小化窗口的Handle,先聲明一個(gè)全局變量,來儲存我們找到的最小化窗口的Handle:
  1. Dim hMin As Long  

      接下來,我們查找最小化窗口的句柄(下面的代碼都在窗體的Load事件里):

  1. Dim hTaskbar, hBar As Long  
  2. hTaskbar = FindWindow("Shell_TrayWnd", vbNullString)            '尋找類名是Shell_TrayWnd的窗口Handle  
  3. hBar = FindWindowEx(hTaskbar, 0, "ReBarWindow32", vbNullString) '尋來找二級容器的Handle  
  4. hMin = FindWindowEx(hBar, 0, "MSTaskSwWClass", vbNullString)    '尋找最小化窗口的Handle  

      找到句柄后,我們來獲得二級容器的坐標(biāo)和最小化窗口的坐標(biāo):

  1. Dim rcBar As RECT  
  2. GetWindowRect(hMin, rcMin)  '獲得最小化窗口的Handle  
  3. GetWindowRect(hBar, rcBar)  '獲得二級容器的Handle  

     下面我們通過用MoveWindow函數(shù)來改變窗口的width:

  1. MoveWindow(hMin, 0, 0, rcMin.Right - rcMin.Left - Me.Width, _  
  2.            rcMin.Bottom - rcMin.Top, True)  

      已經(jīng)為任務(wù)欄騰出地方了,是時(shí)候把程序嵌入到任務(wù)欄里了:

  1. SetParent(Me.Handle, hBar)  '把程序窗口設(shè)置成任務(wù)欄的子窗口  

      調(diào)整程序窗口的大小和位置:

  1. Me.Height = cmdTextBox.Height  
  2. Me.Width = cmdTextBox.Width  
  3. MoveWindow(Me.Handle, rcMin.Right - rcMin.Left - Me.Width + 2, _  
  4.           (rcBar.Bottom - rcBar.Top - Me.Height) / 2, _  
  5.            Me.Width, Me.Height, True)  


      把程序窗口嵌入到任務(wù)欄里的任務(wù)已經(jīng)完成了,但我們還需要處理一下窗體的Closing事件,使程序關(guān)閉的時(shí)候,把最小化窗口的width恢復(fù)回去(下面這一行代碼放在窗體的Closing事件里):

  1. MoveWindow(hMin, 0, 0, rcMin.Right - rcMin.Left, rcMin.Bottom - rcMin.Top, True)  
      終于完成了,現(xiàn)在可以運(yùn)行看一下效果了,和文章一開始的效果一樣吧?

  

By Alexis·M(小孟)  

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
VB愛好者樂園(VBGood) - 經(jīng)驗(yàn)之談 - VB編程的必備技巧
vb訪問SQL Server 的幾種常用方法
vb調(diào)用C++寫的DLL
VB程序設(shè)計(jì)兩次習(xí)題
如何獲取CPU的溫度
VB編外掛的一些基礎(chǔ)知識
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服