Что нового

[Элементы GUI] [Элементы GUI] создать меню в сторонней программе

air

Новичок
Сообщения
1
Репутация
0
доброго времени суток, столкнулся с проблемой встроить своё меню в стороннюю программу и обрабатывать событие в скрипте при нажатии на него. В хелпе нашёл как создать и вставить меню
Код:
#include <GuiMenu.au3>

Opt('MustDeclareVars', 1)

_Main()

Func _Main()
    Local $hWnd, $hMain, $hItem1, $hItem2

    ; Запуск блокнота
    Run("Notepad.exe")
    WinWaitActive("[CLASS:Notepad]")
    $hWnd = WinGetHandle("[CLASS:Notepad]")
    $hMain = _GUICtrlMenu_GetMenu($hWnd)

    ; Create subitem menu
    $hItem1 = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hItem1, 0, "SubItem &1", 0x1000)
    _GUICtrlMenu_InsertMenuItem($hItem1, 1, "SubItem &2", 0x1001)

    ; Create menu
    $hItem2 = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hItem2, 0, "Item &1", 0x2000, $hItem1)
    _GUICtrlMenu_InsertMenuItem($hItem2, 1, "Item &2", 0x2001)
    _GUICtrlMenu_InsertMenuItem($hItem2, 2, "", 0)
    _GUICtrlMenu_InsertMenuItem($hItem2, 3, "Item &3", 0x2002)
    _GUICtrlMenu_InsertMenuItem($hItem2, 4, "Item &4", 0x2003)

    ; Insert new menu into Notepad
    _GUICtrlMenu_InsertMenuItem($hMain, 6, "&AutoIt", 0, $hItem2)
    _GUICtrlMenu_DrawMenuBar($hWnd)

EndFunc   ;==>_Main


В этом примере создаётся меню и вставляется в блокнот, вопрос как обрабатывать потом нажатие на созданое меню?
P.S. - прошу прощения но спойлеры у меня в браузере не работают :( (браузер не причём, сетевой экран и политика компании)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Элементы GUI] создать меню в сторонней программе

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 

justaman

Новичок
Сообщения
7
Репутация
0
тоже интересна эта тема.
ребята с autoitscript.com организовали перехват с помощью длл'ки.
в принципе всё работает. вот только опрос(пока не выбрать один из пунктов нового меню) жрет ~25% процессора.
ничего не подскажете?
вот скрипт:
Код:
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <SendMessage.au3>
#include <GuiMenu.au3>
#include <GuiConstantsEx.au3>

; Windows User Messages
Global Const $UM_ADDMESSAGE = $WM_USER + 0x100

Global $hWndTarget, $sMenuSelection = ""
Global $aCmdID_Menu[6][2] = [ _
	["SubItem &1", 0x2100], _
	["SubItem &2", 0x2101], _
	["Item &1", 0], _
	["Item &2", 0x2001], _
	["Item &3", 0x2002], _
	["Item &4", 0x2003]]

Run("notepad.exe")
WinWaitActive("[CLASS:Notepad]")
$hWndTarget = WinGetHandle("[CLASS:Notepad]")

; Insert menu
_InsertMenu()

; Gather information...
$iPIDTarget = WinGetProcess($hWndTarget)
$iThreadIdTarget = _WinAPI_GetWindowThreadProcessId($hWndTarget, $iPIDTarget)

; Install Filter(s)
$hDll_hook = DllOpen("hook.dll") ;helper dll
DllCall($hDll_hook, "int", "InstallFilterDLL", "long", $WH_CALLWNDPROC, "long", $iThreadIdTarget, "hwnd", $hWndTarget) ; 0 = Ok
DllCall($hDll_hook, "int", "InstallFilterDLL", "long", $WH_GETMESSAGE, "long", $iThreadIdTarget, "hwnd", $hWndTarget) ; 0 = Ok

; Register WM_COMMAND
$hWndLocal = GUICreate("") ;Needed to receive Messages
_SendMessage($hWndTarget, $UM_ADDMESSAGE, $WM_COMMAND, $hWndLocal)
_SendMessage($hWndTarget, $UM_ADDMESSAGE, $WM_SYSCOMMAND, $hWndLocal)
GUIRegisterMsg($WM_COMMAND, "_Filter")
GUIRegisterMsg($WM_SYSCOMMAND, "_Filter")

; Keep running while target exists
While WinExists($hWndTarget)
	If $sMenuSelection <> "" Then
		$sMenuSelection = StringReplace($sMenuSelection, "&", "")
		MsgBox(0, "New Menu", "You selected " & $sMenuSelection)
		$sMenuSelection = ""
	EndIf
WEnd

; Process Callback
Func _Filter($hGUI, $iMsg, $wParam, $lParam)

	Switch $iMsg
		Case $WM_COMMAND
			$iCmdID = _WinAPI_LoWord($wParam)
			For $i = 0 To 5
				If $aCmdID_Menu[$i][1] = $iCmdID Then
					$sMenuSelection = $aCmdID_Menu[$i][0]
				EndIf

			Next
		Case $WM_SYSCOMMAND
			$iCmdID = $wParam
			ConsoleWrite("yeah : " & $iCmdID & @CRLF)
			Return 0
	EndSwitch

	Return $GUI_RUNDEFMSG
EndFunc   ;==>_Filter

Func _InsertMenu()

	Local $hItem1, $hItem2


	$hMenu = _GUICtrlMenu_GetMenu($hWndTarget)

	; Create subitem menu
	$hItem1 = _GUICtrlMenu_CreateMenu()
	_GUICtrlMenu_InsertMenuItem($hItem1, 0, $aCmdID_Menu[0][0], $aCmdID_Menu[0][1])
	_GUICtrlMenu_InsertMenuItem($hItem1, 1, $aCmdID_Menu[1][0], $aCmdID_Menu[1][1])

	; Create menu
	$hItem2 = _GUICtrlMenu_CreateMenu()
	_GUICtrlMenu_InsertMenuItem($hItem2, 0, $aCmdID_Menu[2][0], $aCmdID_Menu[2][1], $hItem1)
	_GUICtrlMenu_InsertMenuItem($hItem2, 1, $aCmdID_Menu[3][0], $aCmdID_Menu[3][1])
	_GUICtrlMenu_InsertMenuItem($hItem2, 2, "", 0)
	_GUICtrlMenu_InsertMenuItem($hItem2, 3, $aCmdID_Menu[4][0], $aCmdID_Menu[4][1])
	_GUICtrlMenu_InsertMenuItem($hItem2, 4, $aCmdID_Menu[5][0], $aCmdID_Menu[5][1])

	; Insert new menu into Notepad
	_GUICtrlMenu_InsertMenuItem($hMenu, 6, "&AutoIt", 0, $hItem2)
	_GUICtrlMenu_DrawMenuBar($hWndTarget)

EndFunc   ;==>_Insertmenu

вот дллка
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
2 justaman

А если так:
Код:
; Keep running while target exists
While WinExists($hWndTarget)
    If $sMenuSelection <> "" Then
        $sMenuSelection = StringReplace($sMenuSelection, "&", "")
        MsgBox(0, "New Menu", "You selected " & $sMenuSelection)
        $sMenuSelection = ""
    EndIf
	Sleep(100)
WEnd

ЗЫ: странно у меня и без нее все отлично работает. А за что именно эта DLL отвечает ??? Не отлично - с ней получше будет.


2 air
Код:
#include <GuiMenu.au3>
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Global $iMemo
Global Enum $idNew = 1000, $idOpen, $idSave, $idExit, $idCut, $idCopy, $idPaste, $idAbout

_Main()

Func _Main()
    Local $hGUI, $hFile, $hEdit, $hHelp, $hMain

    ; Create GUI
    $hGUI = GUICreate("Menu", 400, 300)

    ; Create File menu
    $hFile = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hFile, 0, "&New", $idNew)
    _GUICtrlMenu_InsertMenuItem($hFile, 1, "&Open", $idOpen)
    _GUICtrlMenu_InsertMenuItem($hFile, 2, "&Save", $idSave)
    _GUICtrlMenu_InsertMenuItem($hFile, 3, "", 0)
    _GUICtrlMenu_InsertMenuItem($hFile, 4, "E&xit", $idExit)

    ; Create Edit menu
    $hEdit = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hEdit, 0, "&Cut", $idCut)
    _GUICtrlMenu_InsertMenuItem($hEdit, 1, "C&opy", $idCopy)
    _GUICtrlMenu_InsertMenuItem($hEdit, 2, "&Paste", $idPaste)

    ; Create Help menu
    $hHelp = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hHelp, 0, "&About", $idAbout)

    ; Create Main menu
    $hMain = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hMain, 0, "&File", 0, $hFile)
    _GUICtrlMenu_InsertMenuItem($hMain, 1, "&Edit", 0, $hEdit)
    _GUICtrlMenu_InsertMenuItem($hMain, 2, "&Help", 0, $hHelp)

    ; Set window menu
    _GUICtrlMenu_SetMenu($hGUI, $hMain)

    ; Create memo control
    $iMemo = GUICtrlCreateEdit("", 2, 2, 396, 276, 0)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()

    ; Loop until user exits
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>_Main

; Handle menu commands
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $ilParam
    Switch _WinAPI_LoWord($iwParam)
        Case $idNew
            MemoWrite("New")
        Case $idOpen
            MemoWrite("Open")
        Case $idSave
            MemoWrite("Save")
        Case $idExit
            Exit
        Case $idCut
            MemoWrite("Cut")
        Case $idCopy
            MemoWrite("Copy")
        Case $idPaste
            MemoWrite("Paste")
        Case $idAbout
            MemoWrite("About")
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

; Write message to memo
Func MemoWrite($sMessage)
    GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc   ;==>MemoWrite
 
Верх