.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
建立在TaskBar上没有Item的Form(转载)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

TaskBar上针对每个程式都会有一个Item於其上,按该Item便会Activate该对应的程式
,其实TaskBar上的这些程式Item是用Tab Control做的,所以如果我们能得到TaskBar
上的Tab Control(SysTab)的hWnd,我们便可以随意删除其上的Item了。

1. 一个应用程式启动时, 除了送出 WM_ACTIVE 叫醒自己本身的主要视窗外, 它还会通知
   SysTab (Send ABM_ACTIVATE) 建立该程式在工作列(TaskBar)上的按钮及图示
2. 要让一个应用程式, 按 Alt-Tab 无法切换到, 则必须先改变此应用程式的视窗型态
   为 ToolWindow; 然而在 VB 里面用 Show vbModal 可以达到相同的效果

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
 
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
    ByVal hWndParent As Long, _
    ByVal hWndChild As Long, _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Const GWL_EXSTYLE = (-20)
Const WS_EX_TOOLWINDOW = &H80
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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

Private Const TCM_FIRST = &H1300    ' Tab control messages
Private Const TCM_GETIMAGELIST = (TCM_FIRST + 2)
Private Const TCM_SETIMAGELIST = (TCM_FIRST + 3)
Private Const TCM_GETITEMCOUNT = (TCM_FIRST + 4)
Private Const TCM_GETITEMA = (TCM_FIRST + 5)
Private Const TCM_GETITEMW = (TCM_FIRST + 60)
Private Const TCM_SETITEMA = (TCM_FIRST + 6)
Private Const TCM_SETITEMW = (TCM_FIRST + 61)
Private Const TCM_INSERTITEMA = (TCM_FIRST + 7)
Private Const TCM_INSERTITEMW = (TCM_FIRST + 62)
Private Const TCM_DELETEITEM = (TCM_FIRST + 8)
Private Const TCM_DELETEALLITEMS = (TCM_FIRST + 9)
Private Const TCM_GETITEMRECT = (TCM_FIRST + 10)
Private Const TCM_GETCURSEL = (TCM_FIRST + 11)
Private Const TCM_SETCURSEL = (TCM_FIRST + 12)
Private Const TCM_HITTEST = (TCM_FIRST + 13)
Private Const TCM_SETITEMEXTRA = (TCM_FIRST + 14)
Private Const TCM_ADJUSTRECT = (TCM_FIRST + 40)
Private Const TCM_SETITEMSIZE = (TCM_FIRST + 41)
Private Const TCM_REMOVEIMAGE = (TCM_FIRST + 42)
Private Const TCM_SETPADDING = (TCM_FIRST + 43)
Private Const TCM_GETROWCOUNT = (TCM_FIRST + 44)
Private Const TCM_GETTOOLTIPS = (TCM_FIRST + 45)
Private Const TCM_SETTOOLTIPS = (TCM_FIRST + 46)
Private Const TCM_GETCURFOCUS = (TCM_FIRST + 47)
Private Const TCM_SETCURFOCUS = (TCM_FIRST + 48)
Private Const TCM_SETMINTABWIDTH = (TCM_FIRST + 49)
Private Const TCM_DESELECTALL = (TCM_FIRST + 50)
Private Const TCM_HIGHLIGHTITEM = (TCM_FIRST + 51)
Private Const TCM_SETEXTENDEDSTYLE = (TCM_FIRST + 52)
Private Const TCM_GETEXTENDEDSTYLE = (TCM_FIRST + 53)
Private Const TCM_SETUNICODEFORMAT = &H2005
Private Const TCM_GETUNICODEFORMAT = &H2006

Private Sub Form_Load()
 
    Dim lReturn As Long
    Dim lHwnd As Long

    lReturn = FindWindow("Shell_TrayWnd", vbNullString)    ' 先找 Shell Tray handle
    lReturn = FindWindowEx(lReturn, 0, "MSTaskSwWClass", vbNullString)    ' 再找它的 Child
    lHwnd = FindWindowEx(lReturn, 0, "SysTabControl32", vbNullString)    ' 原来就是这一个
    Me.Show
    'DoEvents
    Me.Visible = False
    '将 Window Extend Style 设成 ToolWindow, 按 Alt-Tab 无法切换到
    lReturn = SetWindowLong(Me.hwnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW)
    '应该设定 Visible 的属性, 才能让改变Window Style的 API 致能
    Me.Visible = True
    ' 将 SysTab 上的最後一个 Item 删掉
    lReturn = SendMessage(lHwnd, TCM_GETITEMCOUNT, 0, ByVal 0)
    lReturn = SendMessage(lHwnd, TCM_DELETEITEM, lReturn - 1, ByVal 0)
 
End Sub



相关文章

相关软件