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

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

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Работа с окном в фоновом режиме
« Ответ #30, Отправлен: Сентябрь 29, 2009, 01:25:32 »
Попробуй так, потом отпишись, что получается.

Код: AutoIt [Выделить]
#Include <GUIToolbar.au3>

Global Const $sTitle = 'Super specific program that works with the server only'
Global Const $iButtonIndex = 0

$hWnd = ControlGetHandle(WinGetHandle($sTitle), '', '[CLASS:TToolbar97;INSTANCE:1]')
_GUICtrlToolbar_ClickIndex($hWnd, $iButtonIndex)



Думай, прежде чем говорить.

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

Re: Работа с окном в фоновом режиме
« Ответ #30 Отправлен: Сентябрь 29, 2009, 01:25:32 »

Оффлайн Belfigor [?]

  • Локальный модератор
  • *
  • Сообщений: 3546
  • Репутация: 929
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Работа с окном в фоновом режиме
« Ответ #31, Отправлен: Сентябрь 29, 2009, 01:26:11 »
Парадоксально но факт, в еве мне удалось кликнуть на элемент интерфейса, а вот ни в твоем примере ни в блокноте не получилось
Хотя опять же год назад я тестил эту UDF только в еве :)

UPD: Попробуй использовать опцию Opt("MouseCoordMode", 0) , в EVE по другому она тыкает не туда куда надо, да и туда куда надо она тыкает с погрешностью в 5-10 пикселей.
« Последнее редактирование: Сентябрь 29, 2009, 01:33:30 от Belfigor »

Любые темы внутри раздела "Разработка ботов" не названные в соответствии с правилами раздела, будут закрываться.
Хорошая музыка должна вызывать тахикардию.
Исландский реп, самый правильный реп.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Работа с окном в фоновом режиме
« Ответ #32, Отправлен: Сентябрь 29, 2009, 01:35:21 »
А все потому, что WM_LBUTTONDOWN и др. работают для исходного окна, а не для элементов (controls), а в моем примере твоя функция тыкает на окно (то, что находится позади фона, фон - это Bitmap - Static Control). А бабочка находится на Bitmap'е и поэтому ничего не получается. С блокнотом тоже самое.

UPD: Opt("MouseCoordMode", 0) здесь вообще не пришей к :Censored: рукав. :) Window Messages его в принципе никак не могут использовать.
« Последнее редактирование: Сентябрь 29, 2009, 01:40:07 от Yashied »

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

Re: Работа с окном в фоновом режиме
« Ответ #32 Отправлен: Сентябрь 29, 2009, 01:35:21 »

Оффлайн Belfigor [?]

  • Локальный модератор
  • *
  • Сообщений: 3546
  • Репутация: 929
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Работа с окном в фоновом режиме
« Ответ #33, Отправлен: Сентябрь 29, 2009, 02:06:36 »
UPD: Opt("MouseCoordMode", 0) здесь вообще не пришей к :Censored: рукав. :) Window Messages его в принципе никак не могут использовать.
Это совет из раздела шоманства, собственно повторное перечитывание этой темы: http://www.autoitscript.com/forum/index.php?showtopic=7112&hl=EVE%20Online&st=0 показало что у половины пользователей эта UDF работает а у половины нет, даже в Паинте ее запустить смог всего один человек, и его пример не сработал у других :)

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Работа с окном в фоновом режиме
« Ответ #34, Отправлен: Сентябрь 29, 2009, 02:22:46 »
...даже в Паинте ее запустить смог всего один человек, и его пример не сработал у других...

Видимо это был автор этой функции. :)

В том виде, в котором эта функция есть, она НИКОГДА не будет работать в Paint'е! Чтобы это работало в Paint'е (в смысле рисовать, а не кнопки тыкать), нужно вместо

WinGetHandle($WinTi)

написать

ControlGetHandle(WinGetHandle($WinTi), '', '[CLASS:Afx:1000000:8;INSTANCE:1]')

:)
« Последнее редактирование: Сентябрь 29, 2009, 02:26:12 от Yashied »

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

Re: Работа с окном в фоновом режиме
« Ответ #34 Отправлен: Сентябрь 29, 2009, 02:22:46 »

Оффлайн Belfigor [?]

  • Локальный модератор
  • *
  • Сообщений: 3546
  • Репутация: 929
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Работа с окном в фоновом режиме
« Ответ #35, Отправлен: Сентябрь 29, 2009, 02:26:20 »
Ухты, спасибо, возьму на заметку

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Работа с окном в фоновом режиме
« Ответ #36, Отправлен: Сентябрь 29, 2009, 02:34:21 »
Все эти WM_... сообщения нужно посылать не основному окну - WinGetHandle(), а тем элементам, на которые мы будем тыкать, т.е. ControlGetHandle().

В случае с EVE, там просто нет никаких элементов управления (я думаю). Все происходит в основном окне (ака DirectX). Поэтому эта :Censored: функция там работает "на ура". Чтобы понять как все это происходит, вот простой пример. Скомпилируй его в EXE и попробуй с помощью своей функции тыкнуть куда-нибудь, заодно оценишь скорость. :sleeping:

Код: AutoIt [Выделить]
#Include <WinAPI.au3>

Global Const $WM_LBUTTONDOWN = 0x0201

GUICreate('MyGUI', 400, 400)
GUIRegisterMsg($WM_LBUTTONDOWN, 'WM_LBUTTONDOWN')
GUISetState()

Do
Until GUIGetMsg() = -3

Func WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)

    Local $hDC = _WinAPI_GetDC($hWnd)

    For $i = -3 To 3
        For $j = -3 To 3
            DllCall('gdi32.dll', 'int', 'SetPixelV', 'hwnd', $hDC, 'int', _WinAPI_LoWord($lParam) + $i, 'int', _WinAPI_HiWord($lParam) + $j, 'dword', 0x0000FF)
        Next
    Next
    _WinAPI_ReleaseDC($hWnd, $hDC)
    Return 0
EndFunc   ;==>WM_LBUTTONDOWN



Попробуй использовать опцию Opt("MouseCoordMode", 0) , в EVE по другому она тыкает не туда куда надо, да и туда куда надо она тыкает с погрешностью в 5-10 пикселей.

Это происходит только потому, что в этой функции присутствует MouseGetPos() и только в случае, если $X = "" и $Y = "". А погрешность объясняется тем, что окно имеет бордюры и заголовок, а значение 0 означает, что отсчет координат ведется от левого верхнего угла окна, а не клиентской облати. В то время, как WM_... всегда работают относительно клиентской области (без учета заголовка и бордюров). Здесь собственно и возникает несостыковка в твои 5-10 пикселей. Правильней было бы записать Opt("MouseCoordMode", 2).

Как видишь никакого шаманства тут нет. :)

И еще, нет никакого смысла при каждом удобном случае писать WinGetHandle(). Достаточно один раз определить хэндл окна и в дальнейшем использовать полученное значение. Это ведь не женщина, никуда не денется :), а лишние (бессмысленные) вычисления нам не нужны.

:smoking:
« Последнее редактирование: Сентябрь 29, 2009, 03:36:09 от Yashied »

Оффлайн r35p3ct [?]

  • Продвинутый
  • ***
  • Сообщений: 226
  • Репутация: 60
  • Пол: Мужской
    • Награды
Re: Работа с окном в фоновом режиме
« Ответ #37, Отправлен: Сентябрь 29, 2009, 12:14:39 »
Попробуй так, потом отпишись, что получается.

Код: AutoIt [Выделить]
#Include <GUIToolbar.au3>

Global Const $sTitle = 'Super specific program that works with the server only'
Global Const $iButtonIndex = 0

$hWnd = ControlGetHandle(WinGetHandle($sTitle), '', '[CLASS:TToolbar97;INSTANCE:1]')
_GUICtrlToolbar_ClickIndex($hWnd, $iButtonIndex)


Результат таков, по этой панели скрипт пытается куда в начало ее кликать, проделал эксперимент с похожей панелью, у которой в начале есть кнопка, он кликнул на кнопку, а у этой в начале текст, вроде лейбла, увеличение ButtonIndex ничего не дало.
UPD: Попробывал ClickAccel,ClickButton эффект одинаковый( Походу это и не кнопка, может и картинка)
« Последнее редактирование: Сентябрь 29, 2009, 13:43:24 от r35p3ct »

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

Re: Работа с окном в фоновом режиме
« Ответ #37 Отправлен: Сентябрь 29, 2009, 12:14:39 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Работа с окном в фоновом режиме
« Ответ #38, Отправлен: Сентябрь 29, 2009, 16:30:15 »
Попробуй ради интереса функцию Belfigor'а, только вместо

WinGetHandle($sTitle)


напиши

ControlGetHandle(WinGetHandle($sTitle), '', '[CLASS:TToolbar97;INSTANCE:1]')

Возможно кликнет куда надо.

Оффлайн r35p3ct [?]

  • Продвинутый
  • ***
  • Сообщений: 226
  • Репутация: 60
  • Пол: Мужской
    • Награды
Re: Работа с окном в фоновом режиме
« Ответ #39, Отправлен: Сентябрь 29, 2009, 22:25:17 »
Попробуй ради интереса функцию Belfigor'а, только вместо

WinGetHandle($sTitle)


напиши

ControlGetHandle(WinGetHandle($sTitle), '', '[CLASS:TToolbar97;INSTANCE:1]')

Возможно кликнет куда надо.
Код: AutoIt [Выделить]
$hWnd1 = ControlGetHandle(WinGetHandle('Title'), '', '[CLASSNN:TButton3]')
WinSetState($hWnd1, '', @SW_DISABLE)
ControlClick($hWnd1, '', '[CLASSNN:TButton3]')
WinSetState($hWnd1, '', @SW_ENABLE)
 

На кнопку жмет) с WinGetHandle не работает.
Но вот как быть с псевдо-кнопкой на тулбаре?

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Работа с окном в фоновом режиме
« Ответ #40, Отправлен: Сентябрь 29, 2009, 23:23:43 »
Нет, я не это имел в виду.

Код: AutoIt [Выделить]
#Include <GUIToolbar.au3>
#Include <WinAPI.au3>

Global Const $sTitle = 'Super Specific Program'
Global Const $X = 50
Global Const $Y = 25

$hWnd = ControlGetHandle(WinGetHandle($sTitle), '', '[CLASS:TToolbar97;INSTANCE:1]')
DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hWnd, 'int', 0x0200, 'int', 0, 'dword', _WinAPI_MakeLong($X, $Y))
Sleep(50)
DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hWnd, 'int', 0x0201, 'int', 1, 'dword', _WinAPI_MakeLong($X, $Y))
Sleep(50)
DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hWnd, 'int', 0x0202, 'int', 1, 'dword', _WinAPI_MakeLong($X, $Y))


У меня это работает. Тебе необходимо только подобрать координаты $X и $Y твоей несчастной кнопки, куда собственно должна кликнуть мышка. Координаты определяются относительно левого верхнего угла TToolbar97.
« Последнее редактирование: Сентябрь 29, 2009, 23:35:03 от Yashied »

Оффлайн Vlasssov [?]

  • Осваивающий
  • **
  • Сообщений: 428
  • Репутация: 25
  • Пол: Мужской
  • Тульский электронный са
    • Яндекс-Дзен
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Работа с окном в фоновом режиме
« Ответ #41, Отправлен: Октябрь 23, 2009, 12:40:48 »
По поводу фонового окна. Во всех примерах, сначала команда run идет, а потом окно желается фоновым. А нет механизма сразу запустить программу в фоновом режиме, и получить ее pid? Чтобы потом и хендл отлавливать окон и нажатия туда слать?
Тульский элетронный самовар

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Работа с окном в фоновом режиме
« Ответ #42, Отправлен: Октябрь 23, 2009, 13:45:11 »
Что-то вроде этого.

Код: AutoIt [Выделить]
#Include <Constants.au3>
#Include <WinAPI.au3>

$Pid = Run('Notepad.exe', '', @SW_HIDE)
If Not WinWait('Untitled - Notepad', '', 3) Then
    Exit
EndIf
$hWnd = WinGetHandle('Untitled - Notepad')
_WinAPI_SetWindowPos($hWnd, $HWND_BOTTOM, 0, 0, 0, 0, BitOR($SWP_NOACTIVATE, $SWP_NOMOVE, $SWP_NOSIZE, $SWP_SHOWWINDOW))


Оффлайн Vlasssov [?]

  • Осваивающий
  • **
  • Сообщений: 428
  • Репутация: 25
  • Пол: Мужской
  • Тульский электронный са
    • Яндекс-Дзен
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Работа с окном в фоновом режиме
« Ответ #43, Отправлен: Октябрь 23, 2009, 14:19:58 »
А  вот эта строчка для чего?
WinAPI_SetWindowPos($hWnd, $HWND_BOTTOM, 0, 0, 0, 0, BitOR($SWP_NOACTIVATE, $SWP_NOMOVE, $SWP_NOSIZE, $SWP_SHOWWINDOW))


Добавлено: Октябрь 24, 2009, 10:51:26
А  вот эта строчка для чего?
WinAPI_SetWindowPos($hWnd, $HWND_BOTTOM, 0, 0, 0, 0, BitOR($SWP_NOACTIVATE, $SWP_NOMOVE, $SWP_NOSIZE, $SWP_SHOWWINDOW))
Тут ошибка, вот как заработало

WinAPI_SetWindowPos($hWnd, $HWND_BOTTOM, 0, 0, 0, 0, BitOR($SWP_NOACTIVATE, $SWP_NOMOVE, $SWP_NOSIZE, $SWP_HIDEWINDOW))
« Последнее редактирование: Октябрь 24, 2009, 10:51:26 от Vlasssov, Причина: Объединение сообщений »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Работа с окном в фоновом режиме
« Ответ #44, Отправлен: Октябрь 24, 2009, 14:46:58 »
Где ошибка?

Код: AutoIt [Выделить]
_WinAPI_SetWindowPos($hWnd, $HWND_BOTTOM, 0, 0, 0, 0, BitOR($SWP_NOACTIVATE, $SWP_NOMOVE, $SWP_NOSIZE, $SWP_SHOWWINDOW))


Эта строчка нужна для того, чтобы показать окно на заднем плане без изменения фокуса. Если тебе нужно невидимое окно, то она вообще тебе не нужна.

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

Re: Работа с окном в фоновом режиме
« Ответ #44 Отправлен: Октябрь 24, 2009, 14:46:58 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
1175 Просмотров
Последний ответ Апрель 14, 2014, 07:55:45
от madmasles
0 Ответов
1100 Просмотров
Последний ответ Август 15, 2014, 22:05:25
от madmasles
6 Ответов
2739 Просмотров
Последний ответ Октябрь 02, 2014, 20:19:45
от DarWiM
0 Ответов
1086 Просмотров
Последний ответ Октябрь 02, 2014, 16:36:25
от madmasles
0 Ответов
1402 Просмотров
Последний ответ Март 14, 2015, 23:24:29
от Pasha Bubyr
0 Ответов
924 Просмотров
Последний ответ Март 15, 2015, 03:36:50
от Yashied
5 Ответов
1991 Просмотров
Последний ответ Июль 29, 2015, 16:21:04
от Prog
2 Ответов
1309 Просмотров
Последний ответ Октябрь 23, 2017, 00:25:00
от Alofa
5 Ответов
1089 Просмотров
Последний ответ Сентябрь 03, 2017, 12:35:37
от ra4o
3 Ответов
863 Просмотров
Последний ответ Сентябрь 04, 2018, 20:01:59
от InnI