Что нового

[Элементы GUI] Новая кнопка в окне стороннего приложения

Enya

Новичок
Сообщения
2
Репутация
0
AutoIt:v3.3.14.2

Категория:Элементы GUI

Описание:
Добрый день, уважаемы форумчане.

Ситуация следующая: есть рабочее приложение. В связи с некоторыми обстоятельствами потребовалось добавить дополнительную проверку при нажатии на кнопку в одном из окон этого приложения. Поскольку исходников приложения у меня нет, а автор отказывается дорабатывать его, было принято решение поверх его кнопки нарисовать скриптом свою.

После изучения материалов справки и форума получилось нарисовать кнопку, получить данные формы, которые надо проверять, заблокировать/разблокировать рабочую кнопку приложения, "нажать" кнопку приложения, но вот обработчик нажатия моей нарисованной кнопки работать не хочет. Подскажите, пожалуйста, как правильно его написать?

И еще один вопрос, на который никак не могу найти ответ и даже не очень представляю, в каких разделах справки или форума искать: скрипт должен срабатывать автоматически, когда появляется определенное окно рабочего приложения. Какими средствами это можно сделать?
Мне кажется, что вариант, с запуском скрипта по расписанию не подойдет, т.к. пользователь может нажать на кнопку в приложении раньше, чем сработает скрипт, и тогда необходимые проверки не будут выполнены.

Код/Пример:
Код:
#include <GUIConstantsEx.au3>
#include <GuiButton.au3>
#include <WindowsConstants.au3>

Global $btn, $rdo, $chk, $aPos, $hControl, $hGUI, $hCombo, $hTextbox

_Main()

Func _Main()

;получаем дескриптор окна
    $hGUI = WinGetHandle("Form1")
;блокируем родную кнопку формы
	$hControl = ControlGetHandle($hGUI, "", "[CLASS:WindowsForms10.BUTTON.app.0.33c0d9d; iNSTANCE:1]")
	ControlDisable ( $hGUI, "", $hControl )
	
;поверх заблокированной рисуем свою
    $aPos = ControlGetPos($hGUI, '', 'OK')
    $btn = _GUICtrlButton_Create($hGUI, "Кнопка1", $aPos[0], $aPos[1], $aPos[2], $aPos[3])

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    GUISetState()

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
        EndSwitch
    WEnd

    Exit

EndFunc   ;==>_Main

; Реакция на нажатие кнопки
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0x0000FFFF)
    Local $hCtrl = $lParam
    Local $sText = ""

    Switch $hCtrl
        Case $btn,
            Switch $nNotifyCode
			Case $BN_CLICKED
					 $sText = "Здесь будет выполняться проверка введенных данных"
                    ;удаляем свою кнопку
					 _GUICtrlButton_Destroy($btn)
					;разблокируем кнопку формы и "нажимаем" ее
					ControlEnable ( $hGUI, "", $hControl )
					ControlClick( $hGUI, "", $hControl, "left", 1)
            EndSwitch
            MsgBox(0,"", $sText)
            Return 0 ; Только для теста нажатия кнопки
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Enya
Вы создаёте кнопку в чужом окне. Следовательно, все сообщения от этой кнопки пойдут тому окну. Поэтому, нужно создать своё окно с кнопкой и наложить его на чужую кнопку. А чтобы не отслеживать перемещения чужого окна, можно его сделать родительским
Код:
#include <GUIConstants.au3>

; запустите Блокнот, выберите пункт "Правка - Заменить..."

; скрипт ждёт активное окно диалога замены
; после чего меняет кнопку "Отмена" и ждёт её нажатия
; и так по кругу

While 1
  ;получаем дескриптор окна
  $hGUI = WinWaitActive("Заменить")
  ;блокируем родную кнопку формы
  $hControl = ControlGetHandle($hGUI, "", "Отмена")
  ControlDisable($hGUI, "", $hControl)
  ;поверх заблокированной рисуем свою
  $aPos = ControlGetPos($hGUI, "", "Отмена")
  $gui = GUICreate("", $aPos[2], $aPos[3], $aPos[0], $aPos[1], $WS_POPUP)
  DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $gui, "hwnd", $hGUI)
  $btn = GUICtrlCreateButton("Кнопка1", 0, 0, $aPos[2], $aPos[3])
  GUISetState()
  GUICtrlSetState($btn, $GUI_FOCUS)
  While 1
    Switch GUIGetMsg()
      Case $btn
        MsgBox(0, "", "Здесь будет выполняться проверка введенных данных")
        GUIDelete($gui)
        ControlEnable($hGUI, "", $hControl)
        ControlClick($hGUI, "", $hControl, "left", 1)
        ExitLoop
    EndSwitch
  WEnd
WEnd
 
Автор
E

Enya

Новичок
Сообщения
2
Репутация
0
InnI, спасибо огромное за помощь! Работает так, как и надо было!
 
Верх