1

Тема: AHK: полностью прозрачная панель задач Windows, возможно ли?

Цель в том, чтобы обоина под ней была видна без искажений, как в оригинале, но не были затронуты иконки приложений, часы и значки уведомлений. На Windows 7 был блюр, а на 8 сделали небольшое затемнение, но даже, если отредактировать тему, удалив оттуда скин таскбара, то панель все равно непрозрачна.

Я вообще думал, что такое невозможно, т.к. за это отвечает Aero движок тем Windows, но в соседних темах творят чудеса.

Вот так это выглядит на Windows 7:

http://fc02.deviantart.net/fs70/f/2013/315/2/5/taskbar_blur_toggle_0_2_0_by_dblake1-d6ti9l5.png

Моя система 8.1 x64.

2

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

Требуется библиотека Acc.

#SingleInstance Force 
#NoEnv  
OnExit Exit
hShellTray := WinExist("ahk_class Shell_TrayWnd ahk_exe explorer.exe") 
ControlGet, hTaskbar, HWND,, MSTaskListWClass1, ahk_id %hShellTray% 
ControlGet, hNotifyWnd, HWND,, TrayNotifyWnd1, ahk_id %hShellTray%  
SetTimer, Reload, 1800000

Loop  {
    Sleep 50
    Acc := Acc_Get("Object", 4, 0, "ahk_id" hTaskbar)
    Acc.accLocation(ComObj(0x4003,&x:=0), 0, ComObj(0x4003,&w:=0), 0, Acc.accChildCount)    
    Right := NumGet(x,0,"int") + NumGet(w,0,"int")
    ControlGetPos, Left, , , , , ahk_id %hNotifyWnd%
    If (prLeft = Left && prRight = Right)
        Continue
    prLeft := Left, prRight := Right
    WinGetPos, wX, , wW, wH, ahk_id %hShellTray% 
    Right -= wX 
    WinSet, Region, % Right "-0 0-0 0-" wH " " Right "-" wH " " Right "-0 "
        . Left "-" wH " " wW "-" wH " " wW "-0 " Left "-0" " " Left "-" wH
        , ahk_id %hShellTray% 
}

Reload:
    Reload
    
Esc::
Exit:
    WinSet, Region, , ahk_id %hShellTray%
    ExitApp 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3 (изменено: serzh82saratov, 2015-01-10 23:14:57)

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

Библиотека Acc не требуется.

Давно неустраивала Acc_Get своей громоздкостью, и ненужным перебором всех Child в объекте, всего лишь для получения одного объекта. По случаю написал функцию Acc_NeedChildren.


#SingleInstance Force 
#NoEnv  
OnExit Exit
hShellTray := WinExist("ahk_class Shell_TrayWnd ahk_exe explorer.exe") 
ControlGet, hTaskbar, HWND,, MSTaskListWClass1, ahk_id %hShellTray% 
ControlGet, hNotifyWnd, HWND,, TrayNotifyWnd1, ahk_id %hShellTray%  
DllCall("LoadLibrary", "Str", "oleacc", "Ptr")
ComObjError(false)
SetTimer, Reload, 1800000

Loop  {
    Sleep 50  
    If ((Acc := Acc_NeedChildren(Acc_ObjectFromWindow(hTaskbar), 4)) = "")
        Continue
    Acc.accLocation(ComObj(0x4003,&x:=0), 0, ComObj(0x4003,&w:=0), 0, Acc.accChildCount)    
    Right := NumGet(x,0,"int") + NumGet(w,0,"int")
    ControlGetPos, Left, , , , , ahk_id %hNotifyWnd%
    If (prLeft = Left && prRight = Right)
        Continue
    prLeft := Left, prRight := Right
    WinGetPos, wX, , wW, wH, ahk_id %hShellTray% 
    Right -= wX
    WinSet, Region, % Right "-0 0-0 0-" wH " " Right "-" wH " " Right "-0 "
        . Left "-" wH " " wW "-" wH " " wW "-0 " Left "-0" " " Left "-" wH
        , ahk_id %hShellTray% 
}

Reload:
    Reload
    
Esc::
Exit:
    WinSet, Region, , ahk_id %hShellTray%
    ExitApp 

Acc_ObjectFromWindow(hWnd, idObject = 0)  {
    If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc) = 0
    Return ComObjEnwrap(9, pacc, 1)
}

Acc_NeedChildren(Acc, Index)  {  
    if DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int", 0, "Int", Index, "Ptr", VarSetCapacity(varChildren, Index * (8 + 2 * A_PtrSize), 0) * 0 + &varChildren, "Int*", Index) = 0  { 
        i := (Index - 1) * (A_PtrSize * 2 + 8) + 8, child := NumGet(varChildren, i)
        return (NumGet(varChildren, i - 8) = 9 ? ComObj(9, ComObjQuery(child, "{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1) : child), ObjRelease(child)
    } 
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4 (изменено: serzh82saratov, 2015-01-11 01:43:10)

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

К Acc_NeedChildren легко прикручивается привычный Path.


DllCall("LoadLibrary","Str","oleacc","Ptr")
Win := WinExist("ahk_class CabinetWClass ahk_exe explorer.exe")    
Acc := Acc_ObjectFromPath(Acc_ObjectFromWindow(Win), "4,3,4,1,4,1,4,1,8")
MsgBox, % Acc.accName(0)
Return

Acc_ObjectFromPath(Acc, Path)  { 
    Loop, parse, Path, `,
        Acc := Acc_NeedChildren(Acc, A_LoopField)
    Return Acc
}

Acc_NeedChildren(Acc, Index)  {  
    If DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int", 0, "Int", Index, "Ptr", VarSetCapacity(varChildren, Index * (8 + 2 * A_PtrSize), 0) * 0 + &varChildren, "Int*", Index) = 0  { 
        i := (Index - 1) * (A_PtrSize * 2 + 8) + 8, child := NumGet(varChildren, i)
        return (NumGet(varChildren, i - 8) = 9 ? ComObj(9, ComObjQuery(child, "{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1) : child), ObjRelease(child)
    } 
}

Acc_ObjectFromWindow(hWnd, idObject = 0)  {
    If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc) = 0
        Return ComObjEnwrap(9, pacc, 1)
}

По результатам тестов, работает на 20-25% процентов быстрее, чем Acc_Get.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

serzh82saratov
Опять удивляете, почти работает. Но становится прозрачной не вся панель, а только свободное место. За иконками и значками уведомлений оно остается, смотрите как это выглядит на 8.1. Т.к. когда-то пытался добиться этого, редактируя стоковую тему, знаю, что у значков уведомлений своя собственная подложка.

http://s017.radikal.ru/i408/1501/c4/f1729d72175e.png
http://s017.radikal.ru/i408/1501/c4/f1729d72175e.png

6

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

Но становится прозрачной не вся панель

Тут у меня никаких идей.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

serzh82saratov
Т.е. у Вас такое же поведение?

8

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

Всё правильно, этот код так и должен делать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

serzh82saratov
Ясно, жаль, но спасибо, так как цель в видимости любого OSD сквозь таскбар выполняется.

10

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

Код из #3 нещадно память пожирает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

teadrinker
Действительно, и однозначно это делает Acc_NeedChildren. Не понимаю, всё сделано по образу по подобию, в чём может быть дело?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

AccessibleChildren()

Clients must call the IUnknown::Release method for any IDispatch interfaces retrieved by this function, and free the array when it is no longer required.

Сейчас подробно некогда смотреть.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

Но я этого не вижу в самой Acc_Children.
Так например память не кушает:

#SingleInstance Force 
#NoEnv  
OnExit Exit
hShellTray := WinExist("ahk_class Shell_TrayWnd ahk_exe explorer.exe") 
ControlGet, hTaskbar, HWND,, MSTaskListWClass1, ahk_id %hShellTray% 
ControlGet, hNotifyWnd, HWND,, TrayNotifyWnd1, ahk_id %hShellTray%   
SetTimer, Reload, 1800000

Loop  {
    Sleep 50  
    If ((Acc := Acc_Children(Acc_ObjectFromWindow(hTaskbar))[4]) = "")
        Continue
    Acc.accLocation(ComObj(0x4003,&x:=0), 0, ComObj(0x4003,&w:=0), 0, Acc.accChildCount)    
    Right := NumGet(x,0,"int") + NumGet(w,0,"int")
    ControlGetPos, Left, , , , , ahk_id %hNotifyWnd%
    If (prLeft = Left && prRight = Right)
        Continue
    prLeft := Left, prRight := Right
    WinGetPos, wX, , wW, wH, ahk_id %hShellTray% 
    Right -= wX
    WinSet, Region, % Right "-0 0-0 0-" wH " " Right "-" wH " " Right "-0 "
        . Left "-" wH " " wW "-" wH " " wW "-0 " Left "-0" " " Left "-" wH
        , ahk_id %hShellTray% 
}

Reload:
    Reload
    
Esc::
Exit:
    WinSet, Region, , ahk_id %hShellTray%
    ExitApp 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

Как ни крутил, так и не понял в чём отличия Acc_NeedChildren от Acc_Children.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

Я так понял, что "oleacc\AccessibleChildren" загружает в память сразу все объекты, и после, их жизненно необходимо все перебрать, чтобы для каждого применить "ObjRelease".
И тут уже заявленный в 4 посте прирост скорости (20-25%) стремится к нулю, потому код ниже отличается от 2 поста, только отсутствием привязки к библиотеке.


#SingleInstance Force 
#NoEnv  
OnExit Exit
hShellTray := WinExist("ahk_class Shell_TrayWnd ahk_exe explorer.exe") 
ControlGet, hTaskbar, HWND,, MSTaskListWClass1, ahk_id %hShellTray% 
ControlGet, hNotifyWnd, HWND,, TrayNotifyWnd1, ahk_id %hShellTray%  
DllCall("LoadLibrary", "Str", "oleacc", "Ptr")
ComObjError(false)
SetTimer, Reload, 1800000

Loop  {
    Sleep 50  
    If ((Acc := Acc_NeedChildren(Acc_ObjectFromWindow(hTaskbar),4)) = "")
        Continue
    Acc.accLocation(ComObj(0x4003,&x:=0), 0, ComObj(0x4003,&w:=0), 0, Acc.accChildCount)    
    Right := NumGet(x,0,"int") + NumGet(w,0,"int")
    ControlGetPos, Left, , , , , ahk_id %hNotifyWnd%
    If (prLeft = Left && prRight = Right)
        Continue
    prLeft := Left, prRight := Right
    WinGetPos, wX, , wW, wH, ahk_id %hShellTray% 
    Right -= wX
    WinSet, Region, % Right "-0 0-0 0-" wH " " Right "-" wH " " Right "-0 "
        . Left "-" wH " " wW "-" wH " " wW "-0 " Left "-0" " " Left "-" wH
        , ahk_id %hShellTray% 
}

Reload:
    Reload
    
Esc::
Exit:
    WinSet, Region, , ahk_id %hShellTray%
    ExitApp 
  
Acc_NeedChildren(Acc, Index) { 
    cChildren:=Acc.accChildCount, Children:=[]
    if DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc), "Int",0, "Int",cChildren, "Ptr",VarSetCapacity(varChildren,cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*",cChildren)=0 {
        Loop %cChildren%
            i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren,i), Children.Insert(NumGet(varChildren,i-8)=9 ? ComObj(9,ComObjQuery(child, "{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1) : child), NumGet(varChildren,i-8)=9 ? ObjRelease(child) : 0
        return Children.MaxIndex() ? Children[Index] : 0
    }  
}

Acc_ObjectFromWindow(hWnd, idObject = 0)  {
    If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc) = 0
        Return ComObjEnwrap(9, pacc, 1)
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

А, нет, всё таки можно увеличить скорость, загружая через AccessibleChildren только нужное количество потомков, особенно заметен прирост, когда в объекте много потомков, а требуемый в начале.


#SingleInstance Force 
#NoEnv  
OnExit Exit
hShellTray := WinExist("ahk_class Shell_TrayWnd ahk_exe explorer.exe") 
ControlGet, hTaskbar, HWND,, MSTaskListWClass1, ahk_id %hShellTray% 
ControlGet, hNotifyWnd, HWND,, TrayNotifyWnd1, ahk_id %hShellTray%  
DllCall("LoadLibrary", "Str", "oleacc", "Ptr")
ComObjError(false)
SetTimer, Reload, 1800000

Loop  {
    Sleep 50  
    If ((Acc := Acc_NeedChildren(Acc_ObjectFromWindow(hTaskbar),4)) = "")
        Continue
    Acc.accLocation(ComObj(0x4003,&x:=0), 0, ComObj(0x4003,&w:=0), 0, Acc.accChildCount)    
    Right := NumGet(x,0,"int") + NumGet(w,0,"int")
    ControlGetPos, Left, , , , , ahk_id %hNotifyWnd%
    If (prLeft = Left && prRight = Right)
        Continue
    prLeft := Left, prRight := Right
    WinGetPos, wX, , wW, wH, ahk_id %hShellTray% 
    Right -= wX
    WinSet, Region, % Right "-0 0-0 0-" wH " " Right "-" wH " " Right "-0 "
        . Left "-" wH " " wW "-" wH " " wW "-0 " Left "-0" " " Left "-" wH
        , ahk_id %hShellTray% 
}

Reload:
    Reload
    
Esc::
Exit:
    WinSet, Region, , ahk_id %hShellTray%
    ExitApp 
  
Acc_NeedChildren(Acc, Index) {  
    if DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int",0, "Int", Index, "Ptr",VarSetCapacity(varChildren, Index*(8+2*A_PtrSize),0)*0+&varChildren, "Int*", Index)=0 {
        Loop %Index%
            i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren, i), Ret := (NumGet(varChildren,i-8)=9 ? ComObj(9,ComObjQuery(child, "{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1) : child), NumGet(varChildren,i-8)=9 ? ObjRelease(child) : 0
        Return Ret
    }
}

Acc_ObjectFromWindow(hWnd, idObject = 0)  {
    If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc) = 0
        Return ComObjEnwrap(9, pacc, 1)
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: полностью прозрачная панель задач Windows, возможно ли?

Раскладка языка пропадает ещё.