Автор Тема: Работа с окном в фоновом режиме  (Прочитано 43794 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Minek [?]

  • Новичок
  • *
  • Сообщений: 10
  • Репутация: 0
    • Награды
Re: Работа с окном в фоновом режиме
« Ответ #45, Отправлен: Декабрь 24, 2009, 09:03:59 »
Возможно ли предотвращать перехват фокуса IE8 при выполнении скрипта? Использую библиотеку IE.au3.
 Скрипт выполняет команды каждую секунду, с каждым действием окно IE вылезает на передний план и становится активно.  Свернутое работает, но хотелось бы видеть, что там происходит, да и работать на этом компьютере в других программах.
 Пытался переползти под FF 3.5, ff.au3, но там беда с русским. Ни ссылок, ни состояния экрана в текстовом виде не получить по человечески. На оперу вообще ничего путного не нашел.  :(

Русское сообщество AutoIt

Re: Работа с окном в фоновом режиме
« Ответ #45 Отправлен: Декабрь 24, 2009, 09:03:59 »

Оффлайн r35p3ct [?]

  • Продвинутый
  • ***
  • Сообщений: 226
  • Репутация: 60
  • Пол: Мужской
    • Награды
Re: Работа с окном в фоновом режиме
« Ответ #46, Отправлен: Декабрь 25, 2009, 14:06:31 »
OffTopicПри создании окна через _IECreate($URL, 0, 0) окна IE вообще не будет видно и соотв. все действия будут в фоне производиться.

Оффлайн Minek [?]

  • Новичок
  • *
  • Сообщений: 10
  • Репутация: 0
    • Награды
Re: Работа с окном в фоновом режиме
« Ответ #47, Отправлен: Январь 13, 2010, 20:27:58 »
Попробую еще один вопрос задать.
Возможно ли передать нажатие клавиши в какой то определенный фрейм текущей странички IE? Например нужно обновить CTRL+F5 какой нить фрейм.
Такая конструкция работает, но обновляет все окошко -

$hWnd = WinGetHandle("Новости")
WinActivate("Новости")
ControlSend($hwnd, "", "", "{F5}")

а вот такая не работает:

$oIE = _IEAttach ("Новости","windowtitle")
$oFrame = _IEFrameGetObjByName ($oIE, "tape")
WinActivate("Новости")
ControlSend($oFrame, "", "", "^{F5}")

К библиотеке IE.au3 просьба не отсылать - хочется разобраться именно с вводом через controlsend, если конечно это вообще возможно.

Русское сообщество AutoIt

Re: Работа с окном в фоновом режиме
« Ответ #47 Отправлен: Январь 13, 2010, 20:27:58 »

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 963
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Работа с окном в фоновом режиме
« Ответ #48, Отправлен: Январь 14, 2010, 11:50:47 »
А зачем использовать ControlSend?
Я так понимаю, стоит задача Refresh только одного фрейма?
Тогда может так:
Код: AutoIt [Выделить]
#include <IE.au3>

$IE =_IECreate( " http://you_domain/index_file.html " )
     _IELoadWait ($IE)  ; Hello Neo! Attention will now reload...
     Sleep(2000)
     $Frames = _IEFrameGetObjByName ($IE, "mainFrame")
     _IEAction ($Frames, "refresh") ;Matrix Reloaded!
     _IELoadWait ($IE)

 

« Последнее редактирование: Январь 14, 2010, 12:00:56 от Garrett »

Скорблю и помню.




Оффлайн Minek [?]

  • Новичок
  • *
  • Сообщений: 10
  • Репутация: 0
    • Награды
Re: Работа с окном в фоновом режиме
« Ответ #49, Отправлен: Январь 15, 2010, 17:54:21 »
Потому что любое действие через IE.au3 помещает окошко IE на передний план и передает на него фокус. Что достало.  :-X А через controlsend вроде как оно где было, там и осталось.

Русское сообщество AutoIt

Re: Работа с окном в фоновом режиме
« Ответ #49 Отправлен: Январь 15, 2010, 17:54:21 »

Оффлайн Yura [?]

  • Новичок
  • *
  • Сообщений: 36
  • Репутация: 7
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Работа с окном в фоновом режиме
« Ответ #50, Отправлен: Ноябрь 27, 2015, 17:03:58 »
Не срабатывал ControlClick в игру, на которую писал бота. При поиске решений наткнулся на эту старую тему и исходя из здесь написанного разобрался в ситуации, хочу этим поделится и хочу еще кое-что уточнить.

В MSDN нашел описание функций PostMessage и SendMessage. Они обе отправляют сообщение по указанному дескриптору окна. Разница в том, что PostMessage помещает сообщение в очередь и сразу возвращается, а SendMessage отправляет сообщение и ждет, пока целевое окно это сообщение обработает. Как вариант сообщением может быть команда о нажатии кнопки мыши или перемещении.
В либе WinAPI.au3 есть _WinAPI_PostMessage, которая работает в фоновых окнах:
Код: AutoIt [Выделить]
; #FUNCTION# ====================================================================================================================
; Author ........: Paul Campbell (PaulIA)
; Modified.......: jpm
; ===============================================================================================================================
Func _WinAPI_PostMessage($hWnd, $iMsg, $wParam, $lParam)
    Local $aResult = DllCall("user32.dll", "bool", "PostMessage", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)
    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_PostMessage


Теперь посмотрим на UDF MouseClickPlus. Как уже написал Yashied, там лишние WinGetHandle, настройка привязки координат мыши и надо понимать какой именно Handle нам нужен: окна или контрола. Если не ошибаюсь по памяти, то и объявление локальных переменных типа  Local $LBDown  =  0x0201 там лишнее, они уже есть в WindowsConstants.au3. Но главное что есть в этой MouseClickPlus - это DllCall, который из user32.dll вызывает функцию SendMessage.
Поэтому у меня возникло мнение, что эта MouseClickPlus просто ниочем, _WinAPI_PostMessage делает ту же работу, только сразу возвращается к программе после вызова. А если в вызове ее dll поменять  PostMessage на SendMessage, то наверняка будет делать абсолютно то же самое.

В другой теме видел вопрос о SendInput для эмуляции нажатия мышки. Из того что прочитал:
SendInput симулирует события нажатия мышки/клавиатуры на более низком уровне. Если воспользоваться функциями  GetKeyState или GetAsyncKeyState, то нажатие через SendInput должно отобразится как и реальное нажатие пользователя. Для сравнения фейково нажатая кнопка через SendMessage там не отображается. От реального нажатия SendInput отличается тем, что не выставляет какого-то флага. Также  SendInput как и реальная клавиатура и мышь может работать только с активным окном.

Теперь к возникшим вопросам.
1) Нашел в AutoIt функцию _SendMessage:
Код: AutoIt [Выделить]
; #FUNCTION# ====================================================================================================================
; Author ........: Valik
; Modified.......: Gary Frost (GaryFrost) aka gafrost
; ===============================================================================================================================
Func _SendMessage($hWnd, $iMsg, $wParam = 0, $lParam = 0, $iReturn = 0, $wParamType = "wparam", $lParamType = "lparam", $sReturnType = "lresult")
    Local $aResult = DllCall("user32.dll", $sReturnType, "SendMessageW", "hwnd", $hWnd, "uint", $iMsg, $wParamType, $wParam, $lParamType, $lParam)
    If @error Then Return SetError(@error, @extended, "")
    If $iReturn >= 0 And $iReturn <= 4 Then Return $aResult[$iReturn]
    Return $aResult
EndFunc   ;==>_SendMessage

У меня она работает только в активном окне почему-то. Но в ней используется не SendMessage, а SendMessageW. В MSDN пишет, что "Unicode and ANSI names - SendMessageW (Unicode) and SendMessageA (ANSI)". Пожалуйста, тыкните где можно почитать что это или обьясните.

2) Второй вопрос. В нескольких примерах перед кликом мышкой видел:
Код: AutoIt [Выделить]
_WinAPI_PostMessage($hWnd, $WM_SETCURSOR, $hWnd, _WinAPI_MakeLong($HTCLIENT, $WM_LBUTTONDOWN))

или прямо в этой теме 
Код: AutoIt [Выделить]
DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hWnd, 'int', 0x0200, 'int', 0, 'dword', _WinAPI_MakeLong($X, $Y)) ;MOUSEMOVE

Я понимаю зачем перемещать курсор при реализации например mousedrag. Но зачем его перемещать перед обычным кликом в фоновом окне? Вроде и без этого работает. Может это делается для большей схожести с работой человека, типа маскировка от антикликеров?))

3) Насколько я понял, ControlClick это реализация функции из 2-х команд, причем между ними нет паузы ($Sleep = 0):
Код: AutoIt [Выделить]
Func MouseLeftClick3($hWnd, $X, $Y, $Sleep)
    _WinAPI_PostMessage($hWnd, $WM_LBUTTONDOWN, 0, _WinAPI_MakeLong($X, $Y))
    Sleep($Sleep)
    _WinAPI_PostMessage($hWnd, $WM_LBUTTONUP, 0, _WinAPI_MakeLong($X, $Y))
EndFunc

потому что в таком виде в этой игре у меня не кликает, а кликает только если дать между командами слип хоть 1 мс. Но как посмотреть реализацию команд ControlClick, MouseClick и т.д., которых я не нашел в папке AutoIT3\Include\ и они не включаются в проект через #include?

Оффлайн masheen [?]

  • Новичок
  • *
  • Сообщений: 25
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Работа с окном в фоновом режиме
« Ответ #51, Отправлен: Июль 29, 2016, 13:45:27 »
Не срабатывал ControlClick в игру, на которую писал бота....

Юра а в итоге, какой код то у тебя начал работать? какой начал кликать в свернутом окне?

Русское сообщество AutoIt

Re: Работа с окном в фоновом режиме
« Ответ #51 Отправлен: Июль 29, 2016, 13:45:27 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
1174 Просмотров
Последний ответ Апрель 14, 2014, 07:55:45
от madmasles
0 Ответов
1098 Просмотров
Последний ответ Август 15, 2014, 22:05:25
от madmasles
6 Ответов
2737 Просмотров
Последний ответ Октябрь 02, 2014, 20:19:45
от DarWiM
0 Ответов
1084 Просмотров
Последний ответ Октябрь 02, 2014, 16:36:25
от madmasles
0 Ответов
1401 Просмотров
Последний ответ Март 14, 2015, 23:24:29
от Pasha Bubyr
0 Ответов
923 Просмотров
Последний ответ Март 15, 2015, 03:36:50
от Yashied
5 Ответов
1985 Просмотров
Последний ответ Июль 29, 2015, 16:21:04
от Prog
2 Ответов
1307 Просмотров
Последний ответ Октябрь 23, 2017, 00:25:00
от Alofa
5 Ответов
1088 Просмотров
Последний ответ Сентябрь 03, 2017, 12:35:37
от ra4o
3 Ответов
859 Просмотров
Последний ответ Сентябрь 04, 2018, 20:01:59
от InnI