Что нового

Кнопки управления приложением в окне предварительного просмотра на панели задач

tech-gs

Знающий
Сообщения
54
Репутация
5
Доброго всем здравия!

Решение поднимаемой темы, возможно, будет интересно многим.
Можно ли средствами AutoIt реализовать возможность новой панели задач Windows 7 - добавить собственные кнопки управления приложением в окне предварительного просмотра на панели задач (ThumbButtons)?
Например, подобные кнопки существуют для Windows Media Player. Они позволяют из окна просмотра переключать треки, а также останавливать воспроизведение.

Объяснение, как это реализуется, видимо на языке C++, нашел на странице http://www.rsdn.ru/article/winshell/taskbar7.xml, но как это перенести в AutoIt?
 
Автор
T

tech-gs

Знающий
Сообщения
54
Репутация
5
Ответ на поставленную задачу нашелся на форуме http://www.autoitscript.com/forum/index.php?showtopic=110868
Ссылка на используемую библиотеку AutoItObject_v1.2.0 - http://autoitobject.origo.ethz.ch/download/2158

Код:
#include <AutoItObject.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <Constants.au3>

Global $oError = ObjEvent("AutoIt.Error", "_ErrFunc")
OnAutoItExitRegister('_Exit')

#region Constants
;THUMBBUTTONMASK
Global Const $THB_BITMAP = 0x00000001
Global Const $THB_ICON = 0x00000002
Global Const $THB_TOOLTIP = 0x00000004
Global Const $THB_FLAGS = 0x00000008

;ThumbEvent
Global Const $THBN_CLICKED = 0x1800

;THUMBBUTTONFLAGS
Global Const $THBF_ENABLED = 0x00000000
Global Const $THBF_DISABLED = 0x00000001
Global Const $THBF_DISMISSONCLICK = 0x00000002
Global Const $THBF_NOBACKGROUND = 0x00000004
Global Const $THBF_HIDDEN = 0x00000008
Global Const $THBF_NONINTERACTIVE = 0x00000010
#endregion

Global $hGui = GUICreate("Thumbnail Buttons", 250, 10)
Global $o_hGui = Number($hGui)
GUIRegisterMsg($WM_COMMAND, 'WM_Command')
GUISetState()

_AutoItObject_StartUp()
Global $pTask
Global $oTaskBar = _GetTaskBarObj($pTask)
$oTaskBar.HrInit()

Global $aButtons
_Create_THUMBBUTTON_Structures($aButtons)
$oTaskBar.ThumbBarAddButtons($o_hGui, 3, Number(DllStructGetPtr($aButtons)))


Do
Until GUIGetMsg() = -3


Func _Create_THUMBBUTTON_Structures(ByRef $Struct)

	$sIcondown = _WinAPI_LoadImage(0, @ScriptDir & '\Icons\Down.ico', $IMAGE_ICON, 16, 16, $LR_LOADFROMFILE)
	$sIconleft = _WinAPI_LoadImage(0, @ScriptDir & '\Icons\Left.ico', $IMAGE_ICON, 16, 16, $LR_LOADFROMFILE)
	$sIconright = _WinAPI_LoadImage(0, @ScriptDir & '\Icons\Right.ico', $IMAGE_ICON, 16, 16, $LR_LOADFROMFILE)

	Local $tagTHUMBBUTTON = "dword;UINT;UINT;handle;WCHAR[260];dword"
	$Struct = DllStructCreate($tagTHUMBBUTTON & ';' & $tagTHUMBBUTTON & ';' & $tagTHUMBBUTTON)

	;Down Button
	DllStructSetData($Struct, 1, BitOR($THB_ICON, $THB_TOOLTIP, $THB_FLAGS));'dwMask'
	DllStructSetData($Struct, 2, 10);'iId'
	DllStructSetData($Struct, 3, 0);'iBitmap'
	DllStructSetData($Struct, 4, $sIcondown);'hIcon'
	DllStructSetData($Struct, 5, 'Down Button');'szTip'
	DllStructSetData($Struct, 6, $THBF_ENABLED);'dwFlags'

	;Left Button
	DllStructSetData($Struct, 7, BitOR($THB_ICON, $THB_TOOLTIP, $THB_FLAGS));'dwMask'
	DllStructSetData($Struct, 8, 11);'iId'
	DllStructSetData($Struct, 9, 0);'iBitmap'
	DllStructSetData($Struct, 10, $sIconleft);'hIcon'
	DllStructSetData($Struct, 11, 'Left Button');'szTip'
	DllStructSetData($Struct, 12, $THBF_ENABLED);'dwFlags'

	;Right Button
	DllStructSetData($Struct, 13, BitOR($THB_ICON, $THB_TOOLTIP, $THB_FLAGS));'dwMask'
	DllStructSetData($Struct, 14, 12);'iId'
	DllStructSetData($Struct, 15, 0);'iBitmap'
	DllStructSetData($Struct, 16, $sIconright);'hIcon'
	DllStructSetData($Struct, 17, 'Right Button');'szTip'
	DllStructSetData($Struct, 18, $THBF_ENABLED);'dwFlags'

EndFunc

; ===================================================================
; _GetTaskBarObj(ByRef $pInstance)
;
; Description. Creates and Returns ITaskbar Interface Object. (Or is this a Dispatch Object?)
; Parameters:
;	$pInstance - IN/OUT - Pointer to var to put CoCreateInstance.
; Returns: ITaskbar Object
;	None.
; ===================================================================
Func _GetTaskBarObj(ByRef $pInstance)

	Local $CLSID_TaskBarlist = _AutoItObject_CLSIDFromString("{56FDF344-FD6D-11D0-958A-006097C9A090}")
	Local $IID_ITaskbarList3 = _AutoItObject_CLSIDFromString("{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}")

	Local $tagInterface = "QueryInterface long(ptr;ptr;ptr);" & _
			"AddRef ulong();" & _
			"Release ulong();" & _
			"HrInit long();" & _
			"AddTab long(hwnd);" & _
			"DeleteTab long(hwnd);" & _
			"ActivateTab long(hwnd);" & _
			"SetActiveAlt long(hwnd);" & _
			"MarkFullscreenWindow long(hwnd;int);" & _
			"SetProgressValue long(hwnd;uint64;uint64);" & _
			"SetProgressState long(hwnd;int);" & _
			"RegisterTab long(hwnd;hwnd);" & _
			"UnregisterTab long(hwnd);" & _
			"SetTabOrder long(hwnd;hwnd);" & _
			"SetTabActive long(hwnd;hwnd;dword);" & _
			"ThumbBarAddButtons long(hwnd;uint;ptr);" & _
			"ThumbBarUpdateButtons long(hwnd;uint;ptr);" & _
			"ThumbBarSetImageList long(hwnd;ptr);" & _
			"SetOverlayIcon long(hwnd;ptr;wstr);" & _
			"SetThumbnailTooltip long(hwnd;wstr);" & _
			"SetThumbnailClip long(hwnd;ptr);"

;~ 	Local $pInstance
	_AutoItObject_CoCreateInstance(DllStructGetPtr($CLSID_TaskBarlist), 0, 1, DllStructGetPtr($IID_ITaskbarList3), $pInstance)

	Return _AutoItObject_WrapperCreate($pInstance, $tagInterface)

EndFunc   ;==>_GetTaskBarObj

Func WM_Command($hWnd, $msg, $wParam, $lParam)

	Local $iMsg = _WinAPI_HiWord($wParam)

	If $iMsg = $THBN_CLICKED Then
		Local $iID = _WinAPI_LoWord($wParam)
		Switch $iID
			Case 11
				MsgBox(0, 'Button Pressed', 'Left Button ID = ' & $iID)
			Case 12
				MsgBox(0, 'Button Pressed', 'Right Button ID = ' & $iID)
			Case 10
				MsgBox(0, 'Button Pressed', 'Down Button ID = ' & $iID)
		EndSwitch
	EndIf

EndFunc   ;==>WM_Command

Func _Exit()
	$oTaskBar = 0
	_AutoItObject_Shutdown()
EndFunc   ;==>_Exit

Func _ErrFunc()
	ConsoleWrite("! COM Error !  Number: 0x" & Hex($oError.number, 8) & "   ScriptLine: " & $oError.scriptline & " - " & $oError.windescription & @CRLF)
	Return
EndFunc   ;==>_ErrFunc

Развитие темы (3 примера) - http://www.autoitscript.com/forum/index.php?showtopic=111018

Используемые файлы см. в аттаче.


Код программы нужно заключать в соответствующий тег!
-----Medic84
 
Верх