snoitaleR сказал(а):Мне удалось найти пример для Delphi, но адаптировать под AutoIt не хватает опыта...
а не подскажешь, как это сделать? создать окно в стиле POPUP? и начать оформлять?Yashied сказал(а):Самый простой способ - сделать свой скин и наставить туда сколько угодно кнопок.
И ещё один, использующий слежение за кнопкойВот пример
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;
$hGUI = GUICreate(" Custom Caption button", 350, 200)
$hButton_GUI = GUICreate("", 65, 18, -1, -1, $WS_POPUP, -1, $hGUI)
$nMyButton = GUICtrlCreateButton("Minimize v2", 0, 0, 65, 18)
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
_GUIButtonSetPos_Proc()
GUISetState(@SW_SHOW, $hButton_GUI)
GUISetState(@SW_SHOW, $hGUI)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $nMyButton
WinSetState($hGUI, "", @SW_MINIMIZE)
EndSwitch
WEnd
Func WM_MOVE($hWndGUI, $iMsg, $wParam, $lParam)
;Local $iX = BitAND($lParam, 0xFFF)
;Local $iY = BitShift($lParam, 16)
_GUIButtonSetPos_Proc()
EndFunc
Func _GUIButtonSetPos_Proc()
Local $aGUIPos = WinGetPos($hGUI)
Local $aGUIClientSize = WinGetClientSize($hGUI)
Local $iX = $aGUIPos[0]
Local $iY = $aGUIPos[1]
Local $iBorder_Size = ($aGUIPos[2] - $aGUIClientSize[0]) / 2
WinMove($hButton_GUI, "", $iX+25, $iY+$iBorder_Size)
EndFunc
прости, просто мой хрустальный шар подвел меня. не сразу понял что окно не AutoIt- овское :laugh:w3d сказал(а):Вообще, я имел в виду положить кнопку на совершенно постороннее окно, не AutoIT-овское.
Я этот принцип показал на примере выше, но со своим окном.принцип примерно таков
#include <WindowsConstants.au3>
;
Opt("GUICloseOnESC", 0)
Opt("GUIOnEventMode", 1)
Opt("WinWaitDelay", 0)
Run(@WindowsDir & "\Notepad.exe")
WinWait("[CLASS:Notepad]")
$hParent = WinGetHandle("[CLASS:Notepad]")
$hButton_GUI = GUICreate("", 65, 18, -1, -1, $WS_POPUP, -1, $hParent)
$nMyButton = GUICtrlCreateButton("Button", 0, 0, 65, 18)
GUICtrlSetOnEvent(-1, "_Button_Event")
GUISetState(@SW_SHOW, $hButton_GUI)
$aOld_ParentPos = -1
While 1
$aParentPos = WinGetPos($hParent)
$aParentClientSize = WinGetClientSize($hParent)
If Not IsArray($aParentPos) Then Exit
If $aOld_ParentPos = -1 Or $aOld_ParentPos[0] <> $aParentPos[0] Or $aOld_ParentPos[1] <> $aParentPos[1] Then
$aOld_ParentPos = $aParentPos
$iX = $aParentPos[0]
$iY = $aParentPos[1]
$iBorder_Size = ($aParentPos[2] - $aParentClientSize[0]) / 2
WinMove($hButton_GUI, "", ($iX + $aParentPos[2]) - 170, $iY + $iBorder_Size)
Else
Sleep(1)
EndIf
WEnd
Func _Button_Event()
ConsoleWrite("Button clicked" & @CRLF)
Exit
EndFunc
Pardon moi, Monsieur. Ни коим образом не посягал на ваш копирайт :beer:CreatoR сказал(а):Я этот принцип показал на примере выше, но со своим окном.
CreatoR сказал(а):Kaster [?]Я этот принцип показал на примере выше, но со своим окном.принцип примерно таков
Вот пример для чужого окна:
Я это определяю в примере, используется общая высота окна минус высота его клиентской части.как можно определить высоту заголовка окна
Вот это уже посложнее, я сам пока над колдую.какие стандартные кнопки на нем есть, чтобы разместить свою кнопку (например, размером 18х18) вплотную к ним?
Это проще:тобы при нажатии на кнопку вываливалось меню из пары-тройки пунктов
#include <WindowsConstants.au3>
;
Opt("GUICloseOnESC", 0)
Opt("GUIOnEventMode", 1)
Opt("WinWaitDelay", 0)
Run(@WindowsDir & "\Notepad.exe")
WinWait("[CLASS:Notepad]")
$hParent = WinGetHandle("[CLASS:Notepad]")
$hButton_GUI = GUICreate("", 65, 18, -1, -1, $WS_POPUP, -1, $hParent)
$nButton = GUICtrlCreateButton("Button", 0, 0, 65, 18)
GUICtrlSetOnEvent(-1, "_Button_Event")
$DummyMenu = GUICtrlCreateDummy()
$ContextMenu = GUICtrlCreateContextMenu($DummyMenu)
$MenuItem1 = GUICtrlCreateMenuItem("Some Item1", $ContextMenu)
$MenuItem2 = GUICtrlCreateMenuItem("Some Item2", $ContextMenu)
$MenuItem3 = GUICtrlCreateMenuItem("Some Item3", $ContextMenu)
GUICtrlCreateMenuItem("", $ContextMenu)
$Exit_Item = GUICtrlCreateMenuItem("Exit", $ContextMenu)
GUICtrlSetOnEvent(-1, "_Exit")
GUISetState(@SW_SHOW, $hButton_GUI)
$aOld_ParentPos = -1
While 1
$aParentPos = WinGetPos($hParent)
$aParentClientSize = WinGetClientSize($hParent)
If Not IsArray($aParentPos) Then Exit
If $aOld_ParentPos = -1 Or $aOld_ParentPos[0] <> $aParentPos[0] Or $aOld_ParentPos[1] <> $aParentPos[1] Or _
$aOld_ParentPos[2] <> $aParentPos[2] Or $aOld_ParentPos[3] <> $aParentPos[3] Then
$aOld_ParentPos = $aParentPos
$iBorder_Size = ($aParentPos[2] - $aParentClientSize[0]) / 2
$iX = ($aParentPos[0] + $aParentPos[2]) - 170
$iY = $aParentPos[1] + $iBorder_Size
If $aParentPos[2] < 170 Then $iX = $aParentPos[0] + $iBorder_Size
WinMove($hButton_GUI, "", $iX, $iY)
Else
Sleep(1)
EndIf
WEnd
Func _Button_Event()
ConsoleWrite("Button clicked" & @CRLF)
_GUICtrlMenu_Show($hButton_GUI, $ContextMenu, $nButton)
EndFunc
Func _GUICtrlMenu_Show($hWnd, $nContextID, $nContextControlID, $iMouse=0)
Local $hMenu = GUICtrlGetHandle($nContextID)
Local $iCtrlPos = ControlGetPos($hWnd, "", $nContextControlID)
Local $iX = $iCtrlPos[0]
Local $iY = $iCtrlPos[1] + $iCtrlPos[3]
; Convert the client (GUI) coordinates to screen (desktop) coordinates
;ClientToScreen
Local $stPoint = DllStructCreate("int;int")
DllStructSetData($stPoint, 1, $iX)
DllStructSetData($stPoint, 2, $iY)
DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))
$iX = DllStructGetData($stPoint, 1)
$iY = DllStructGetData($stPoint, 2)
;ClientToScreen
If $iMouse Then
$iX = MouseGetPos(0)
$iY = MouseGetPos(1)
EndIf
DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $iX, "int", $iY, "hwnd", $hWnd, "ptr", 0)
EndFunc
Func _Exit()
Exit
EndFunc
If WinActive("Form1") Then
$hGUI_Map = WinGetHandle("Form1")
_CreateButton()
EndIf
Func _CreateButton()
Opt("GUIOnEventMode", 1)
Opt("WinWaitDelay", 0)
$hButton_GUI = GUICreate("", 65, 18, -1, -1, $WS_POPUP, -1, $hGUI_Map)
$nButton = GUICtrlCreateButton("Button", 0, 0, 65, 18)
GUICtrlSetOnEvent(-1, "_Button_Event")
GUISetState(@SW_SHOW, $hButton_GUI)
$aOld_ParentPos = -1
$aParentPos = WinGetPos($hGUI_Map)
$aParentClientSize = WinGetClientSize($hGUI_Map)
If Not IsArray($aParentPos) Then Exit
If $aOld_ParentPos = -1 Or $aOld_ParentPos[0] <> $aParentPos[0] Or $aOld_ParentPos[1] <> $aParentPos[1] Or _
$aOld_ParentPos[2] <> $aParentPos[2] Or $aOld_ParentPos[3] <> $aParentPos[3] Then
$aOld_ParentPos = $aParentPos
$iBorder_Size = ($aParentPos[2] - $aParentClientSize[0]) / 2
$iX = ($aParentPos[0] + $aParentPos[2]) - 170
$iY = $aParentPos[1] + $iBorder_Size
If $aParentPos[2] < 170 Then $iX = $aParentPos[0] + $iBorder_Size
WinMove($hButton_GUI, "", $iX, $iY)
Else
Sleep(1)
EndIf
EndFunc
Func _Button_Event()
ConsoleWrite("Button clicked" & @CRLF)
;_GUICtrlMenu_Show($hButton_GUI, $ContextMenu, $nButton)
EndFunc
А что ты ожидаешь если эта кнопка создаётся в цикле, и при чём постоянно, пока окно активно .в результате, если таскаю появившееся окно по экрану - остаются нарисованные кнопки в разных местах
#include <WindowsConstants.au3>
Opt("GUICloseOnESC", 0)
Opt("GUIOnEventMode", 1)
Opt("WinWaitDelay", 0)
Global $hButton_GUI, $nButton, $ContextMenu
Global $MenuItem1, $MenuItem2, $MenuItem3, $Exit_MenuItem
Global $aOld_ParentPos = -1, $hParent, $hOld_Parent
Global $sMain_Title = "[CLASS:Notepad]"
Run(@WindowsDir & "\Notepad.exe")
WinWait($sMain_Title)
$hParent = WinGetHandle($sMain_Title)
_ExternalButtonCreate_Proc()
AdlibEnable("_ExternalButtonFollow_Proc", 1)
While 1
Sleep(100)
WEnd
Func _ExternalButtonCreate_Proc()
$hButton_GUI = GUICreate("", 65, 18, -1, -1, $WS_POPUP, $WS_EX_TOPMOST+$WS_EX_TOOLWINDOW)
$nButton = GUICtrlCreateButton("Button", 0, 0, 65, 18)
GUICtrlSetOnEvent(-1, "_Button_Event")
Local $DummyMenu = GUICtrlCreateDummy()
$ContextMenu = GUICtrlCreateContextMenu($DummyMenu)
$MenuItem1 = GUICtrlCreateMenuItem("Some Item1", $ContextMenu)
$MenuItem2 = GUICtrlCreateMenuItem("Some Item2", $ContextMenu)
$MenuItem3 = GUICtrlCreateMenuItem("Some Item3", $ContextMenu)
GUICtrlCreateMenuItem("", $ContextMenu)
$Exit_MenuItem = GUICtrlCreateMenuItem("Exit", $ContextMenu)
GUICtrlSetOnEvent(-1, "_Exit")
GUISetState(@SW_SHOW, $hButton_GUI)
EndFunc
Func _ExternalButtonFollow_Proc()
If $hParent <> -1 And Not WinExists($hParent) Then
GUISetState(@SW_HIDE, $hButton_GUI)
$hParent = -1
ElseIf $hParent = -1 And WinExists($sMain_Title) Then
GUISetState(@SW_SHOW, $hButton_GUI)
$hParent = WinGetHandle($sMain_Title)
ElseIf $hParent = -1 Then
Return
EndIf
$aParentPos = WinGetPos($hParent)
$aParentClientSize = WinGetClientSize($hParent)
If Not IsArray($aParentPos) Then Return
If Not WinActive($hParent) And Not WinActive($hButton_GUI) Then
$aParentPos[0] = -3200
$aParentPos[1] = -3200
EndIf
If $aOld_ParentPos = -1 Or $aOld_ParentPos[0] <> $aParentPos[0] Or $aOld_ParentPos[1] <> $aParentPos[1] Or _
$aOld_ParentPos[2] <> $aParentPos[2] Then
$aOld_ParentPos = $aParentPos
$iBorder_Size = ($aParentPos[2] - $aParentClientSize[0]) / 2
$iX = ($aParentPos[0] + $aParentPos[2]) - 170
$iY = $aParentPos[1] + $iBorder_Size
If $aParentPos[2] < 170 Then $iX = $aParentPos[0] + $iBorder_Size
WinMove($hButton_GUI, "", $iX, $iY)
EndIf
EndFunc
Func _Button_Event()
ConsoleWrite("Button clicked" & @CRLF)
_GUICtrlMenu_Show($hButton_GUI, $ContextMenu, $nButton)
EndFunc
Func _GUICtrlMenu_Show($hWnd, $nContextID, $nContextControlID, $iMouse=0)
Local $hMenu = GUICtrlGetHandle($nContextID)
Local $iCtrlPos = ControlGetPos($hWnd, "", $nContextControlID)
Local $iX = $iCtrlPos[0]
Local $iY = $iCtrlPos[1] + $iCtrlPos[3]
; Convert the client (GUI) coordinates to screen (desktop) coordinates
;ClientToScreen
Local $stPoint = DllStructCreate("int;int")
DllStructSetData($stPoint, 1, $iX)
DllStructSetData($stPoint, 2, $iY)
DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))
$iX = DllStructGetData($stPoint, 1)
$iY = DllStructGetData($stPoint, 2)
;ClientToScreen
If $iMouse Then
$iX = MouseGetPos(0)
$iY = MouseGetPos(1)
EndIf
DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $iX, "int", $iY, "hwnd", $hWnd, "ptr", 0)
EndFunc
Func _Exit()
Exit
EndFunc
Func _ExternalButtonCreate_Proc()
....
GUISetState(@SW_SHOW, $hButton_GUI)
EndFunc
GUISetState(@SW_HIDE, $hButton_GUI)