Что нового

Перехват у Windows управления для выполнения скрипта

antikos89

Новичок
Сообщения
6
Репутация
0
Добрый день!
У меня возник следующий вопрос, существует ли способ перехватить у Windows управление при старте скрипта из автозагрузки , и дать ему возможность отработать со сторонним приложением без помех, со стороны других приложений, а затем вернуть управление Windows?
За ранее благодарен.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
antikos89 [?]
перехватить у Windows управление
Что имеется под словом перехватить управление? Если у Windows перехватить управление, то вся система повиснет и назад уже ничего не вернётся, потому что кто-то всё же должен управлять.
Конкретно скрипт в студию и конкретно описание помехи, которая не даёт выполнить то-то и то-то.
 
Автор
A

antikos89

Новичок
Сообщения
6
Репутация
0
Я видимо немного не так выразился :smile:Мне необходимо чтоб после загрузки Windows стартовал скрипт (на данный момент запускаю его через автозагрузку Windows), отрабатывал с запускаемым из него же приложением, без помех со стороны других приложений, которые тоже стартуют вместе с операционкой. Пока что борюсь с потерей фокуса у скрипта на окно интересующего меня приложения с помощью установки sleep() и blockinput(), но хотелось бы как нибудь дополнительно поlстраховаться :smile:


Добавлено:
Сообщение автоматически объединено:

Вот мой скрипт!

Код:
local $okno,$hToolbar
sleep (7000)
BlockInput(1)
Run('c:\Owen\opm.exe c:\Owen\1.opm');
sleep (500)
WinSetState ("", "", @SW_MAXIMIZE)
WinActivate("[Last]", "")
$okno=WinGetHandle("[ACTIVE]"); окно имеет пустой заголовок, поэтому пытаюсь выкрутится так
#Include <GuiToolBar.au3>
#include <GUIConstantsEx.au3>
$hToolbar = ControlGetHandle('[CLASS:ThunderRT6FormDC]', '', '[CLASS:ToolbarWindow32; INSTANCE:1]')
sleep(1000)
_GUICtrlToolbar_ClickButton($hToolbar, 109); жму интересующие меня кнопки
sleep(1000)
_GUICtrlToolbar_EnableButton($hToolbar, 111, False)

Global Const $SC_CLOSE = 0xF060; деактивирую кнопку закрыть в правом верхнем углу приложения


WinActivate($okno, "")
$hWnd = WinGetHandle("[REGEXPCLASS:Notepad.*]")

_WinAPI_RemoveMenu($okno, $SC_CLOSE)

Func _WinAPI_RemoveMenu($okno, $iFlag)
    Local $aMenu = DllCall("User32.dll", "hwnd", "GetSystemMenu", "hwnd",$okno, "int", 0)
    If @error Then Return SetError(1)
    DllCall("User32.dll", "int", "RemoveMenu", "hwnd", $aMenu[0] , "int", $iFlag, "int", 0x0)
EndFunc


WinSetState ($okno, '', @SW_MINIMIZE)
$okno=0
BlockInput(0)
Exit
 
Автор
A

antikos89

Новичок
Сообщения
6
Репутация
0
Я попробую, конечно, но решит ли это проблему перехвата фокуса от активного окна моего приложения, окнами антивируса или к примеру драйверов видио карты подгружаемых вместе с windows, притом они всплывают с непостоянной переодичностью при старте системы, но пару раз не давали скрипту нормально отработать?
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Код:
#include <GuiToolBar.au3> ; UDF указываются в верху, а не в центре.

Local $okno, $hToolbar
Sleep(7000)
BlockInput(1)
Run('c:\Owen\opm.exe c:\Owen\1.opm');
Sleep(500)
WinSetState("", "", @SW_MAXIMIZE) ; максимизе чего? первое попашееся под руку?
WinActivate("[Last]", "") ; Это от предыдущего вызова, первое попашееся под руку?
; Вообще тут WinActivate при успехе возвращает дескриптор, и получать его дополнительно функцией WinGetHandle не требуется.
; А если возвращает 0 то предусмотреть выход программы, так как всё остальное становится бессмысленным.
$okno = WinGetHandle("[ACTIVE]"); окно имеет пустой заголовок, поэтому пытаюсь выкрутится так (класс имеется? текст в окне имеется? для 100-процентности можно получить все окна и проверить соответствие конкретному размеру окна)
$hToolbar = ControlGetHandle('[CLASS:ThunderRT6FormDC]', '', '[CLASS:ToolbarWindow32; INSTANCE:1]')
Sleep(1000) ; нужно ли ждать так долго, может 100-300 достаточно
_GUICtrlToolbar_ClickButton($hToolbar, 109); жму интересующие меня кнопки
Sleep(1000) ; нужно ли ждать так долго, может 100-300 достаточно
_GUICtrlToolbar_EnableButton($hToolbar, 111, False)

Global Const $SC_CLOSE = 0xF060; деактивирую кнопку закрыть в правом верхнем углу приложения (это установка значения константы)

WinActivate($okno, "")
$hWnd = WinGetHandle("[REGEXPCLASS:Notepad.*]") ; откуда это захват?, если от WinActivate, то предыдущий уже возвращает десриптор.

_WinAPI_RemoveMenu($okno, $SC_CLOSE) ; тут могло бы быть _GUICtrlMenu_GetSystemMenu и _GUICtrlMenu_RemoveMenu

Func _WinAPI_RemoveMenu($okno, $iFlag)
	Local $aMenu = DllCall("User32.dll", "hwnd", "GetSystemMenu", "hwnd", $okno, "int", 0) ; тоже что _GUICtrlMenu_GetSystemMenu
	If @error Then Return SetError(1)
	DllCall("User32.dll", "int", "RemoveMenu", "hwnd", $aMenu[0], "int", $iFlag, "int", 0x0) ; тоже что _GUICtrlMenu_RemoveMenu
EndFunc   ;==>_WinAPI_RemoveMenu

WinSetState($okno, '', @SW_MINIMIZE)
$okno = 0
BlockInput(0) ; рекомендуется до кучи задействовать AdlibRegister на случай если скрипт повиснет, чтобы вызвать разблокироку чере 4 сек.
Exit
 
Автор
A

antikos89

Новичок
Сообщения
6
Репутация
0
Да действительно, сейчас отлавливаю окно по классу! Вчера проверил, вроде все работает. Большие задержки на sleep объясняются возможностью для приложения обработать команду от скрипта, иначе начинает некорректно отрабатывать следующие команды. Захват Notepad тут вообще не причем - копировал готовый пример, не дочистил ненужное :smile:По поводу самой функции деактивации кнопки закрыть, не могу ничего сказать, не вполне понимаю как она работает,из за нехватки знаний, тупо скопировал и вставил:smile: Вопрос следующий: хватит ли теперь отлова окна по классу, для того чтобы вплывающие окна от других приложений не вмешивались в работу скрипта, не терялся фокус с главного окна моего приложения, до завершения работы скрипта? Пока вроде бы выручает первоначальный sleep в 7 с, чтоб дать возможность системе прогрузиться.
 
Верх