VB6之调整任务栏按钮的位置
好无聊,睡前一更~
XP的任务栏没办法像win7那样随意拖动交换顺序,偶觉不爽,遂写程序搞之。这个不算什么新东西,参考了很多别人写的东东。
程序启动后,会在右下角托盘区显示钢铁侠的图标。右键击之,可选择退出程序全局范围内,使用快捷键Ctrl+方向键左(或者右)即可调整任务栏的按钮(即程序)的位置。
由于我在调试的时候使用了很多debug.print,觉得有碍观瞻的童鞋可以删除之。点我下载源文件!
有图才有真相:

这里仅贴出主要实现的模块:
'主要实现模块
'code by lichmama@cnblogs.com
Private Type TOOLBAR_BUTTONGROUPINFO
AppTitle As String
ToolTip As String
hWnd As Long 'parent hwnd
btnId() As Long
btnIndex() As Long
End Type Private Function GetToolbarHwnd() As Long
Dim tbHwnd As Long
Dim ClassName As Variant For Each ClassName In Array("Shell_TrayWnd", _
"ReBarWindow32", _
"MSTaskSwWClass", _
"ToolbarWindow32")
tbHwnd = FindWindowEx(tbHwnd, &, ClassName, vbNullString)
Next
GetToolbarHwnd = tbHwnd
End Function Private Sub GetToolbarInfo(ByRef tb() As TOOLBAR_BUTTONGROUPINFO)
Dim tbHwnd As Long
Dim BtnCount As Long
Dim pid As Long
Dim hp As Long
Dim pmem As Long tbHwnd = GetToolbarHwnd()
BtnCount = SendMessage(tbHwnd, TB_BUTTONCOUNT, &, &)
Call GetWindowThreadProcessId(tbHwnd, pid)
hp = OpenProcess(PROCESS_ALL_ACCESS Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, pid)
pmem = VirtualAllocEx(hp, ByVal &, ByVal &, MEM_COMMIT, PAGE_READWRITE) Dim i As Long
Dim btnId As Long
Dim pbuff As Long
Dim lpbuff() As Byte
Dim pbtnHwnd As Long
Dim btnHwnd As Long For i = To BtnCount - Call SendMessage(tbHwnd, TB_GETBUTTON, i, ByVal pmem)
'get button-id
Call ReadProcessMemory(hp, ByVal pmem + , ByVal VarPtr(btnId), ByVal &, ByVal &) 'get the tooltip or program-title of button
Call ReadProcessMemory(hp, ByVal pmem + , ByVal VarPtr(pbuff), ByVal &, ByVal &)
Call ReadProcessMemory(hp, ByVal pbuff, ByVal VarPtr(lpbuff()), ByVal &, &) 'get hwnd of button-parent-window
Call ReadProcessMemory(hp, ByVal pmem + , ByVal VarPtr(pbtnHwnd), ByVal , ByVal &)
Call ReadProcessMemory(hp, ByVal pbtnHwnd, ByVal VarPtr(btnHwnd), ByVal , ByVal &) Debug.Print BtnCount, i, btnId, Hex(btnHwnd), Left(lpbuff, InStr(lpbuff, Chr()))
If i Mod = Then
ReDim Preserve tb(i \ ) As TOOLBAR_BUTTONGROUPINFO
End If
If btnHwnd = Then
With tb(i \ )
.AppTitle = Left(lpbuff, InStr(lpbuff, Chr()))
.btnId() = btnId
.btnIndex() = i
End With
Else
With tb(i \ )
.btnId() = btnId
.btnIndex() = i
.hWnd = btnHwnd
.ToolTip = Left(lpbuff, InStr(lpbuff, Chr()))
End With
End If Next Call VirtualFreeEx(hp, ByVal pmem, ByVal &, MEM_RELEASE)
Call CloseHandle(hp)
End Sub Private Sub MoveToolbarButton(ByVal CurrentIndex As Long, _
ByVal Position As Long, _
Optional Direction = ) Dim tbHwnd As Long
tbHwnd = GetToolbarHwnd() 'move right
If Direction = Then
Call SendMessage(tbHwnd, TB_MOVEBUTTON, CurrentIndex, ByVal (CurrentIndex + Position * ))
Call SendMessage(tbHwnd, TB_MOVEBUTTON, CurrentIndex, ByVal (CurrentIndex + Position * ))
'move left
ElseIf Direction = Then
Call SendMessage(tbHwnd, TB_MOVEBUTTON, CurrentIndex, ByVal (CurrentIndex - Position * ))
CurrentIndex = CurrentIndex +
Call SendMessage(tbHwnd, TB_MOVEBUTTON, CurrentIndex, ByVal (CurrentIndex - Position * ))
End If
End Sub Private Sub MoveButton(Optional Direction As Long)
Dim tb() As TOOLBAR_BUTTONGROUPINFO
Call GetToolbarInfo(tb)
If Direction = Then
Call MoveToolbarButton(tb().btnIndex(), UBound(tb), )
ElseIf Direction = Then
Call MoveToolbarButton(tb(UBound(tb)).btnIndex(), UBound(tb), )
End If
Erase tb
End Sub Public Function CallbackWndProc(ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long If wMsg = WM_HOTKEY Then
If wParam = HotKeyId1 Then
Debug.Print "move top right side"
Call MoveButton()
ElseIf wParam = HotKeyId2 Then
Debug.Print "move top left side"
Call MoveButton()
End If
ElseIf wMsg = WM_NOTIFYICON Then
If lParam = WM_RBUTTONUP Then
Debug.Print "Right Button Clicked"
Form1.PopupMenu Form1.TrayMenu
ElseIf lParam = WM_LBUTTONUP Then
Debug.Print "Left Button Clicked"
End If
End If
CallbackWndProc = CallWindowProc(lpPrevWndFunc, hWnd, wMsg, wParam, lParam)
End Function Public Function LoadIconFromRes() As Long
'该功能的实现参考了以下2个链接
'@http://bbs.csdn.net/topics/360099153
'@http://blog.csdn.net/modest/article/details/2468937 Dim lpIE As ICONDIRENTRY
Dim buff() As Byte buff = LoadResData(, "ICON")
'For i = 0 To buff(4) - 1
' Call CopyMemory(lpIE, buff(6 + i * Len(lpIE)), Len(lpIE))
' Debug.Print lpIE.bWidth
'Next
Call CopyMemory(lpIE, buff(), Len(lpIE))
LoadIconFromRes = CreateIconFromResourceEx(buff(lpIE.dwImageOffset), lpIE.dwBytesInRes, -, &H30000, &, &, &)
Erase buff
End Function Public Sub SetNotifyIcon()
With notify
.cbSize = Len(notify)
.hIcon = LoadIconFromRes()
.hWnd = Form1.hWnd
.szTip = "ToolbarSwitcher ver/0.1" & vbCrLf & _
"Code by lichmama@cnblogs.com" & Chr()
.uCallbackMessage = WM_NOTIFYICON
.uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
.uID = &
End With
Call Shell_NotifyIcon(NIM_ADD, notify)
End Sub Public Sub RemoveNotifyIcon()
Call Shell_NotifyIcon(NIM_DELETE, notify)
End Sub
VB6之调整任务栏按钮的位置的更多相关文章
- iOS开发 横向分页样式 可左右滑动或点击头部栏按钮进行页面切换
iOS开发 横向分页样式 可左右滑动或点击头部栏按钮进行页面切换 不多说直接上效果图和代码 1.设置RootViewController为一个导航试图控制器 // Copyright © 2016年 ...
- 使用RelativeLayout控制WebView以及Bottom按钮的位置
使用RelativeLayout控制WebView以及Bottom按钮的位置 (地址) 在Design View中加入控件RelativeLayout, WebView, LinearLayout(H ...
- jQuery实现两个按钮的位置互换
页面上有2个按钮A和B.点击按钮A和按钮B互换位置 ,点击按钮B和按钮A互换位置.应该如何实现? html代码如下: <body> <!--页面上有2个按钮A和B. 点击按钮A和按钮 ...
- 使用ultramon调整任务栏高度
取消锁定,调整任务栏的高度为一行图标的高度,然后再锁定即可.为啥程序没有默认设置?
- scroll与按钮的位置
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- delphi 任务栏按钮闪烁(转)
如果您创建的应用程序是运行在Windows 98或更高版本操作系统上,您可以通过调用API函数FlashWindowEx并赋给它一个FlashWInfo结构体来实现. 而如果是运行在Windows ...
- DELPHI中如何闪烁应用程序窗口或任务栏按钮
使用FlashWindowEx函数: 一.设置FlashWInfoDelphi中TFlashWInfo申明如下:TypeTFlashWInfo = record cbSize : LongInt; h ...
- iOS开发项目之四 [ 调整自定义tabbar的位置与加号按钮的位置]
自定义tabbar与按钮的添加 01 - 把系统的tabbar用我们自己的覆盖 LHQTabBar *lhqTabBar = [[LHQTabBar alloc]init]; [self setVal ...
- 1014-32-首页13-cell的结构分析---导航栏中间title位置的按钮的尺寸设置---setFrame----
#import "HWTitleButton.h" #define HWMargin 5 @implementation HWTitleButton - (id)initWithF ...
随机推荐
- 项目Contact开发中遇到的,引以为戒
程序进去就闪退 其中指示错误的地方,函数内容如下: public void loadButtomMenu() { gv_buttom_menu = (GridView) this.findViewBy ...
- 关于JAVA自带MD5的方法
有空再详细解释 import java.security.MessageDigest; public class MD5 { public final static String MD51(Strin ...
- ReentrantLock深入学习
ReentrankLock 分为 非公平锁及公平锁 首先我们看一下它里面有哪些属性: private final Sync sync;Sync 这个类是 ReentrantLock的 一个静态内部类 ...
- DOM4J介绍与代码示例
DOM4J是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JA ...
- Vue中过度动画效果应用
一.实现动画过渡效果的几种方式 实现动画必须要将要进行动画的元素利用<transition>标签进行包裹 1.利用CSS样式实现过渡效果 <transition name=" ...
- DATA VISUALIZATION – PART 2
A Quick Overview of the ggplot2 Package in R While it will be important to focus on theory, I want t ...
- 时间序列分析算法【R详解】
简介 在商业应用中,时间是最重要的因素,能够提升成功率.然而绝大多数公司很难跟上时间的脚步.但是随着技术的发展,出现了很多有效的方法,能够让我们预测未来.不要担心,本文并不会讨论时间机器,讨论的都是很 ...
- OVS + dpdk 安装与实验环境配置
***DPDK datapath的OVS的安装与实验环境配置 首先肯定是DPDK的安装 0:安装必要的工具 make gcc ...
- Java异常类(Throwable)
一.异常类体系 二.异常类由来与定义 [异常类的由来]:Java把程序在运行时出现的各种不正常情况也看成了对象, 提取属性和行为进行描述,比如异常名称,异常信息,异常发生位置,从而形成了各种异常类 [ ...
- 读Zepto源码之样式操作
这篇依然是跟 dom 相关的方法,侧重点是操作样式的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zepto1.2. ...