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 ...
随机推荐
- How to parse project properties or how to parse files with key-value pair
If a file has content like raven.enabled = false raven.host = "localhost" raven.port = 808 ...
- Servlet路径映射
Serlvlet路径映射 当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url. 容器默认请求的是一个Servlet,所以不会直接根据 ...
- struts2.1.6教程十一、注解配置
在此先略去注解配置的实例,具体可以参看官方提供的文档.其实在熟悉struts及相关的一些内容后,再来看文档是比较容易理解得.只是要注意使用注解Annotition时: (1)要多导入一个jar包:st ...
- cmd批处理延迟代码 结束进程
choice /t 5 /d y /n >nul taskkill /im chrome.exe /f pause
- bug 修复:上传库存时前端回发file_name参数丢失;
# tmp_file = os.path.join(os.path.abspath('youcart/tmp'), json.loads(request.data).get('file_name')) ...
- 正则表达式入门案例C#
---恢复内容开始--- 在网上百度了好多关于正则表达式的,不过好多都是关于语法的,没有一个具体的案例,有点让人难以入门,毕竟我还是喜欢由具体到抽象的认识.所以我就在这先提供了一个入门小案例(学了了6 ...
- windows 配置 Scheme + Emacs 编程环境
软件下载列表: Emacs Racket (这里使用 Racket ,更加方便,便于后面配置 Emacs) 配置 安装好 Emacs 后,在 C:\Users\用户名\AppData\Roaming\ ...
- Python+requests库 POST接口图片上传
捕获到POST接口的请求参数,如下: 包括data.file两个部分,上传代码如下: 比较简单,直接发送files参数即可 heads中 content-type 折腾了1个小时,呵呵
- AES加密解密算法---java
package com.BFGJ.AES; import java.util.Random; import java.util.StringTokenizer; import javax.crypto ...
- cookie笔记(一)
1.浏览器存储信息的一个工具 2.容量有限,每个域名一般50个.详情 3.形式:键=值: 4.获取:document.cookie; 5.设置:document.cookie="uid=we ...