purebasic.info

PureBasic forum
Текущее время: Чт июл 19, 2018 10:42 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Вт июл 03, 2018 11:52 am 
Не в сети
доцент

Зарегистрирован: Пн июн 28, 2010 1:07 pm
Сообщений: 74
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Создание простого окна, с некоторыми действиями, то есть после запуска прогаммы будет некоторый перфоманс-представление то есть
Создание простого окна, самого простого окна с произвольными размерами и создание живого движениия в нем, например автоматическое движения мышкой, клик, листание картинок, звуковой сигнал и далее автоматическое закрытие окна через произвольное время.

то есть вся движуха происходит визуально в теле программы, в рамках только периметра окна этой программы, а не всего экрана компьютера.

создать и вызвать окно не сложно

а вот в создании некоторого движения в нем я еще имею мало опыта


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт июл 03, 2018 1:25 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2280
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
"Движения" должны быть настоящими? В смысле например должны нажиматься настоящие кнопки в окне программы и т.д.? Либо можно просто покадрово показать словно видео заранее приготовленное...

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт июл 03, 2018 2:46 pm 
Не в сети
доцент

Зарегистрирован: Пн июн 28, 2010 1:07 pm
Сообщений: 74
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
qpAHToMAS писал(а):
"Движения" должны быть настоящими? В смысле например должны нажиматься настоящие кнопки в окне программы и т.д.? Либо можно просто покадрово показать словно видео заранее приготовленное...



Да. движения должны быть реальными, то есть настоящие физические действия мышью.

а там хоть запуск встроенного видеопроигрывателя с определенным видео.

Мне нужны пока просто нажатия, по фону этого окна произвольно,

можно на кнопки в окне, или вы хотите в этом окне вызвать какую то мини программу например нажатие на кнопку плэй в видео проигрывателе или вызов браузера внутри тела этого окна (встроенный браузер)?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт июл 03, 2018 2:49 pm 
Не в сети
доцент

Зарегистрирован: Пн июн 28, 2010 1:07 pm
Сообщений: 74
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
да еще это интересно запуск встроенного проигрывателя или встроенного браузера в теле этого окна.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт июл 03, 2018 4:00 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Цитата:
да еще это интересно запуск встроенного проигрывателя или встроенного браузера в теле этого окна.

см. SetParent_

Если правильно понял, то нужно это (старый-престарый пример Петра для калькулятора "как есть"):
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Prog=RunProgram("calc.exe","","",#PB_Program_Open) 
 If Prog=0
   End
 EndIf
 
 Repeat
   ; Поиск главного окна программы
   HWND1=FindWindow_(0,"Калькулятор")
   Delay(1)
 Until HWND1>0 ; если нашли хендл главного окна то выходим из цикла
 
 OpenWindow(0,0,0,400,400,"Мышеловка для калькулятора ))",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
 MoveWindow_(HWND1, 10,10, 100, 100, #True)
 SetParent_(HWND1, WindowID(0) )
 
 Repeat
   Event = WaitWindowEvent()
 Until Event = #PB_Event_CloseWindow
 
 If IsProgram(Prog)
   KillProgram(Prog)
   CloseProgram(Prog)
 EndIf



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт июл 03, 2018 4:06 pm 
Не в сети
доцент

Зарегистрирован: Пн июн 28, 2010 1:07 pm
Сообщений: 74
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
knower писал(а):
Цитата:
да еще это интересно запуск встроенного проигрывателя или встроенного браузера в теле этого окна.

см. SetParent_

Если правильно понял, то нужно это (старый-престарый пример Петра для калькулятора "как есть"):
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Prog=RunProgram("calc.exe","","",#PB_Program_Open) 
 If Prog=0
   End
 EndIf
 
 Repeat
   ; Поиск главного окна программы
   HWND1=FindWindow_(0,"Калькулятор")
   Delay(1)
 Until HWND1>0 ; если нашли хендл главного окна то выходим из цикла
 
 OpenWindow(0,0,0,400,400,"Мышеловка для калькулятора ))",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
 MoveWindow_(HWND1, 10,10, 100, 100, #True)
 SetParent_(HWND1, WindowID(0) )
 
 Repeat
   Event = WaitWindowEvent()
 Until Event = #PB_Event_CloseWindow
 
 If IsProgram(Prog)
   KillProgram(Prog)
   CloseProgram(Prog)
 EndIf



Спасибо, сейчас гляну, чуть позже отпишусь


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт июл 03, 2018 4:17 pm 
Не в сети
доцент

Зарегистрирован: Пн июн 28, 2010 1:07 pm
Сообщений: 74
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
да.
все верно.
только в окне после запуска через н-ноэ количество времени
например запускается действие, мышь например начинает шевелиться
и жать на кнопки или просто делать произвольные клики внути периметра окна


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт июл 06, 2018 6:43 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Цитата:
только в окне после запуска через н-ноэ количество времени
например запускается действие, мышь например начинает шевелиться
и жать на кнопки или просто делать произвольные клики внути периметра окна

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
Global hWnd.l, hwnd1.l, stop.i=0, maxx.i=0, maxy.i=0
 
Structure QuadPointUnion
  StructureUnion
    p.POINT
    q.q
  EndStructureUnion
EndStructure
 
Procedure RedrawWindows()
  InvalidateRect_(hWnd1, 0, 1)
  UpdateWindow_(hWnd1)
  InvalidateRect_(hWnd, 0, 1)
  UpdateWindow_(hWnd)
  SetForegroundWindow_(hWnd)
EndProcedure
 
Procedure MoveCursor(x1, y1, x2, y2)
  Protected dy = Abs(y2 - y1), yInc = Sign(y2 - y1)
  Protected dx = Abs(x2 - x1), xInc = Sign(x2 - x1)
  Protected rowAc, ColAc
  Protected y = y1, x = x1
 
  err = dx
  If dy > dx
    err = dy
  EndIf
  endPt = err
  If err = dx
    rowAc = endPt / 2
  Else
    ColAc = endPt / 2
  EndIf
  While err > 0
    If stop
      Break
    EndIf
    rowAc + dy
    If rowAc >= endPt
      rowAc - endPt
      y + yInc
    EndIf
    ColAc + dx
    If ColAc >= endPt
      ColAc - endPt
      x + xInc
    EndIf
    If x>=maxx
      Break
    EndIf
    If y>=maxy
      Break
    EndIf
    SetCursorPos_(x, y)
    Delay(2)
    err - 1
  Wend
EndProcedure
 
 
 
Prog = RunProgram("calc.exe","","",#PB_Program_Open|#PB_Program_Hide)
If Prog = 0
  End
EndIf
 
Repeat
  ; Поиск главного окна программы
  ;HWND1=FindWindow_(0,"Калькулятор")
  hWnd=FindWindow_("CalcFrame", 0)
  Delay(1)
Until hWnd>0 ; если нашли хендл главного окна то выходим из цикла
 
GetWindowRect_(hWnd, @wr.RECT)
x = GetSystemMetrics_(#SM_CXFRAME)
y = GetSystemMetrics_(#SM_CYCAPTION)+GetSystemMetrics_(#SM_CYFRAME)
w = wr\right-wr\left
h = wr\bottom-wr\top
Borderx = 2*x
Bordery = GetSystemMetrics_(#SM_CYCAPTION) + 2*(GetSystemMetrics_(#SM_CYFRAME))
 
 
hwnd1 = OpenWindow(0,0,0,510,482,"Куркулятор",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible)
MoveWindow_(hWnd, -x, -y, w, h, #True)
SetParent_(hWnd, WindowID(0))
 
ShowWindow_(hwnd1, #SW_SHOW)
ShowWindow_(hWnd, #SW_SHOW)
RedrawWindows()
 
minx = WindowX(0, #PB_Window_InnerCoordinate)
miny = WindowY(0, #PB_Window_InnerCoordinate)
;maxx = WindowX(0, #PB_Window_InnerCoordinate) + WindowWidth(0, #PB_Window_InnerCoordinate)
;maxy = WindowY(0, #PB_Window_InnerCoordinate) + WindowHeight(0, #PB_Window_InnerCoordinate)
 
 
 
;ClearStructure(@wr, RECT)
GetWindowRect_(hWnd, @wr.RECT)
width = wr\right - wr\left
height = wr\bottom - wr\top
 
maxx = minx + width - Borderx
maxy = miny + height - Bordery
 
If maxx > minx + WindowWidth(0, #PB_Window_InnerCoordinate)
  maxx = minx + WindowWidth(0, #PB_Window_InnerCoordinate)
EndIf
 
If maxy > miny + WindowHeight(0, #PB_Window_InnerCoordinate)
  maxy = miny + WindowHeight(0, #PB_Window_InnerCoordinate)
EndIf
 
 
; внутренняя область нашего окна
x1=Random(maxx, minx)
y1=Random(maxy, miny)
 
AddWindowTimer(0, 1, 1000)
AddWindowTimer(0, 2, 50)
 
Temp.POINT
m.QuadPointUnion
cClass.s = Space(200)
 
  Repeat
    Event = WaitWindowEvent()
      Select Event
        Case #PB_Event_MinimizeWindow, #PB_Event_MoveWindow
          RedrawWindows()
         
        Case #PB_Event_Timer
          ActiveWindow = GetForegroundWindow_()
          If ActiveWindow = hWnd Or ActiveWindow = hwnd1
            If EventTimer() = 1
              x2=Random(maxx, minx)
              y2=Random(maxy, miny)
              MoveCursor(x1, y1, x2, y2)
              GetCursorPos_(@Temp)  ; Текузая позиция курсора мышки относительно экрана
              x1=Temp\x
              y1=Temp\y
               
              m\p\x = Temp\x
              m\p\y = Temp\y
              hWindow = WindowFromPoint_(m\q)
               
              GetClassName_(hWindow, @cClass,200)
 
              ; Debug hWindow
              ; Debug cClass
               
              If cClass = "Button"
                Debug "это кнопка. жму!"
                mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTDOWN, MouseX,MouseY,0,0) ; Эмуляция нажатия левой кнопки мышки
                Delay(100) ; Пауза на 100 миллисекунд
                mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTUP, MouseX,MouseY,0,0) ; Эмуляция отпускания левой кнопки мышки
              Else
                Debug "мимо кассы. пропускаю"
              EndIf
                 
            ElseIf EventTimer() = 2
              If GetAsyncKeyState_(#VK_ESCAPE)= -32767
                RemoveWindowTimer(0, 2)
                RemoveWindowTimer(0, 1)
                stop=1
              EndIf
            EndIf
          EndIf
      EndSelect
  Until Event = #PB_Event_CloseWindow
 
If IsProgram(Prog)
  KillProgram(Prog)
  CloseProgram(Prog)
EndIf


Esc - выход (удаление таймеров).


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июл 07, 2018 11:10 am 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Немного изменённая версия. Так будет чуть точнее.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
Global.l hWnd, hwnd1, KbdWnd
Global.i stop=0, maxx=0, maxy=0
 
Structure QuadPointUnion
  StructureUnion
    p.POINT
    q.q
  EndStructureUnion
EndStructure
 
Procedure RedrawWindows()
  InvalidateRect_(hWnd1, 0, 1)
  UpdateWindow_(hWnd1)
  InvalidateRect_(hWnd, 0, 1)
  UpdateWindow_(hWnd)
  SetForegroundWindow_(hWnd)
EndProcedure
 
Procedure MoveCursor(x1, y1, x2, y2)
  Protected dy = Abs(y2 - y1), yInc = Sign(y2 - y1)
  Protected dx = Abs(x2 - x1), xInc = Sign(x2 - x1)
  Protected rowAc, ColAc
  Protected y = y1, x = x1
 
  err = dx
  If dy > dx
    err = dy
  EndIf
  endPt = err
  If err = dx
    rowAc = endPt / 2
  Else
    ColAc = endPt / 2
  EndIf
  While err > 0
    If stop
      Break
    EndIf
    rowAc + dy
    If rowAc >= endPt
      rowAc - endPt
      y + yInc
    EndIf
    ColAc + dx
    If ColAc >= endPt
      ColAc - endPt
      x + xInc
    EndIf
    If x=maxx
      Break
    EndIf
    If y=maxy
      Break
    EndIf
    SetCursorPos_(x, y)
    Delay(2)
    err - 1
  Wend
EndProcedure
 
Procedure.l enumChildren(ChildWnd.l)
  If ChildWnd
    classText.s = Space(256)
    GetClassName_(ChildWnd, @classText, 256)
    If classText = "#32770"
      ;Debug classText
      If FindWindowEx_(ChildWnd,0,@"Button",0)
        KbdWnd = ChildWnd
        ProcedureReturn 0
      EndIf
    EndIf
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
 
 
Prog = RunProgram("calc.exe","","",#PB_Program_Open|#PB_Program_Hide)
If Prog = 0
  End
EndIf
 
Repeat
  ; Поиск главного окна программы
  ;HWND1=FindWindow_(0,"Калькулятор")
  hWnd=FindWindow_("CalcFrame", 0)
  Delay(1)
Until hWnd>0 ; если нашли хендл главного окна то выходим из цикла
 
GetWindowRect_(hWnd, @wr.RECT)
x = GetSystemMetrics_(#SM_CXFRAME)
y = GetSystemMetrics_(#SM_CYCAPTION)+GetSystemMetrics_(#SM_CYFRAME)
w = wr\right-wr\left
h = wr\bottom-wr\top
 
 
hwnd1 = OpenWindow(0,0,0,510,482,"Куркулятор",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible)
MoveWindow_(hWnd, -x, -y, w, h, #True)
SetParent_(hWnd, WindowID(0))
 
ShowWindow_(hwnd1, #SW_SHOW)
ShowWindow_(hWnd, #SW_SHOW)
RedrawWindows()
 
 
FrameWnd = FindWindowEx_(hWnd,0,@"CalcFrame",0)
EnumChildWindows_(FrameWnd, @enumChildren(), 0)
 
If KbdWnd=0
  Debug "хэндл клавиатуры куркулятора не найден"
  End
EndIf
 
 
GetWindowRect_(KbdWnd, @wr.RECT)
width = wr\right - wr\left
height = wr\bottom - wr\top
 
minx = wr\left
miny = wr\top
maxx = minx + width
maxy = miny + height
 
 
;не даём мышке выйти за пределы клавиатуры (на время работы таймеров)
ClipCursor_(@wr)
 
 
x1=Random(maxx, minx)
y1=Random(maxy, miny)
 
AddWindowTimer(0, 1, 1000)
AddWindowTimer(0, 2, 50)
 
Temp.POINT
m.QuadPointUnion
cClass.s = Space(200)
 
  Repeat
    Event = WaitWindowEvent()
      Select Event
        Case #PB_Event_MinimizeWindow, #PB_Event_MoveWindow
          RedrawWindows()
         
        Case #PB_Event_Timer
          ActiveWindow = GetForegroundWindow_()
          If ActiveWindow = hWnd Or ActiveWindow = hwnd1
            If EventTimer() = 1
              x2=Random(maxx, minx)
              y2=Random(maxy, miny)
              MoveCursor(x1, y1, x2, y2)
              GetCursorPos_(@Temp)  ; Текузая позиция курсора мышки относительно экрана
              x1=Temp\x
              y1=Temp\y
               
              m\p\x = Temp\x
              m\p\y = Temp\y
              hWindow = WindowFromPoint_(m\q)
               
              GetClassName_(hWindow, @cClass,200)
 
              ; Debug hWindow
              ; Debug cClass
               
              If cClass = "Button"
                Debug "это кнопка. жму!"
                mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTDOWN, Temp\x,Temp\y,0,0) ; Эмуляция нажатия левой кнопки мышки
                Delay(100) ; Пауза на 100 миллисекунд
                mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTUP, Temp\x,Temp\y,0,0) ; Эмуляция отпускания левой кнопки мышки
              Else
                Debug "мимо кассы. пропускаю"
              EndIf
                 
            ElseIf EventTimer() = 2
              If GetAsyncKeyState_(#VK_ESCAPE)= -32767
                RemoveWindowTimer(0, 2)
                RemoveWindowTimer(0, 1)
                ClipCursor_(0)
                stop=1
              EndIf
            EndIf
          EndIf
      EndSelect
  Until Event = #PB_Event_CloseWindow
 
If IsProgram(Prog)
  KillProgram(Prog)
  CloseProgram(Prog)
EndIf


Вот и посчитайте теперь сколько будет дважды два используя только мышЪ! :mrgreen:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июл 07, 2018 1:11 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
И ещё точнее (регион - хорошо, но кнопки лучше).
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
Global NewList Buttons.Point()
Global.l hWnd, hwnd1, KbdWnd
Global.i stop=0
 
 
Procedure RedrawWindows()
  InvalidateRect_(hWnd1, 0, 1)
  UpdateWindow_(hWnd1)
  InvalidateRect_(hWnd, 0, 1)
  UpdateWindow_(hWnd)
  SetForegroundWindow_(hWnd)
EndProcedure
 
Procedure MoveCursor(x1, y1, x2, y2)
  Protected dy = Abs(y2 - y1), yInc = Sign(y2 - y1)
  Protected dx = Abs(x2 - x1), xInc = Sign(x2 - x1)
  Protected rowAc, ColAc
  Protected y = y1, x = x1
 
  err = dx
  If dy > dx
    err = dy
  EndIf
  endPt = err
  If err = dx
    rowAc = endPt / 2
  Else
    ColAc = endPt / 2
  EndIf
  While err > 0
    If stop
      Break
    EndIf
    rowAc + dy
    If rowAc >= endPt
      rowAc - endPt
      y + yInc
    EndIf
    ColAc + dx
    If ColAc >= endPt
      ColAc - endPt
      x + xInc
    EndIf
    SetCursorPos_(x, y)
    Delay(2)
    err - 1
  Wend
EndProcedure
 
Procedure.l enumChildren(ChildWnd.l)
  Protected classText.s = Space(256)
 
  If ChildWnd
    GetClassName_(ChildWnd, @classText, 256)
    If classText = "#32770"
      If FindWindowEx_(ChildWnd,0,@"Button",0)
        KbdWnd = ChildWnd
        ProcedureReturn 0
      EndIf
    EndIf
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
 
Procedure.l EnumProcedure(ChildWnd.l)
  Protected classText.s = Space(256)
 
  If ChildWnd
    GetClassName_(ChildWnd, @classText, 256)
    If classText = "Button"
      GetWindowRect_(ChildWnd, @btn.RECT)
      AddElement(Buttons())
      Buttons()\x = btn\Left + ((btn\right - btn\left)/2)
      Buttons()\y = btn\top + ((btn\bottom - btn\top)/2)
    EndIf
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
 
 
 
Prog = RunProgram("calc.exe","","",#PB_Program_Open|#PB_Program_Hide)
If Prog = 0
  End
EndIf
 
Repeat
  ; Поиск главного окна программы
  ;HWND1=FindWindow_(0,"Калькулятор")
  hWnd=FindWindow_("CalcFrame", 0)
  Delay(1)
Until hWnd>0 ; если нашли хендл главного окна то выходим из цикла
 
GetWindowRect_(hWnd, @wr.RECT)
x = GetSystemMetrics_(#SM_CXFRAME)
y = GetSystemMetrics_(#SM_CYCAPTION)+GetSystemMetrics_(#SM_CYFRAME)
w = wr\right-wr\left
h = wr\bottom-wr\top
 
 
hwnd1 = OpenWindow(0,0,0,510,482,"Куркулятор",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible)
MoveWindow_(hWnd, -x, -y, w, h, #True)
SetParent_(hWnd, WindowID(0))
 
ShowWindow_(hwnd1, #SW_SHOW)
ShowWindow_(hWnd, #SW_SHOW)
RedrawWindows()
 
 
FrameWnd = FindWindowEx_(hWnd,0,@"CalcFrame",0)
EnumChildWindows_(FrameWnd, @enumChildren(), 0)
If KbdWnd=0
  Debug "хэндл окна клавиатуры куркулятора не найден  :("
  End
EndIf
 
 
EnumChildWindows_(KbdWnd, @EnumProcedure(), 0)
LS = ListSize(Buttons())
If LS = 0
  Debug "координаты кнопок куркулятора не определены  :("
  End
EndIf
LS-1
RandomizeList(Buttons()) ; перемешаем список
 
 
GetWindowRect_(KbdWnd, @wr.RECT)
width = wr\right - wr\left
height = wr\bottom - wr\top
ClipCursor_(@wr) ;не даём мышке выйти за пределы клавиатуры (на время работы таймеров)
 
 
Element = Random(LS, 0) ; выбор случайного элемента
SelectElement(Buttons(), Element)
x1 = Buttons()\x
y1 = Buttons()\y
 
 
; запуск таймеров
AddWindowTimer(0, 1, 1000)
AddWindowTimer(0, 2, 50)
 
 
  Repeat
    Event = WaitWindowEvent()
      Select Event
        Case #PB_Event_MinimizeWindow, #PB_Event_MoveWindow
          RedrawWindows()
         
        Case #PB_Event_Timer
          ActiveWindow = GetForegroundWindow_()
          If ActiveWindow = hWnd Or ActiveWindow = hwnd1 ; перемещать курсор только тогда, когда активно либо наше окно либо окно куркулятора
            If EventTimer() = 1
              Repeat
                Element = Random(LS, 0)
                SelectElement(Buttons(), Element)
                x2 = Buttons()\x
                y2 = Buttons()\y
              Until x2<>x1 Or y2<>y1
              MoveCursor(x1, y1, x2, y2)
              x1 = x2
              y1 = y2
              mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTDOWN, x1,y1,0,0) ; Эмуляция нажатия левой кнопки мышки
              Delay(100) ; Пауза на 100 миллисекунд
              mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTUP, x1,y1,0,0) ; Эмуляция отпускания левой кнопки мышки
 
            ElseIf EventTimer() = 2
              If GetAsyncKeyState_(#VK_ESCAPE)= -32767
                RemoveWindowTimer(0, 2)
                RemoveWindowTimer(0, 1)
                ClipCursor_(0)
                stop=1
              EndIf
            EndIf
          EndIf
      EndSelect
  Until Event = #PB_Event_CloseWindow
 
If IsProgram(Prog)
  KillProgram(Prog)
  CloseProgram(Prog)
EndIf


Если всё же удалось сосчитать 2х2, то можно усложнить задачу путём:
1. нажать "Esc", чтобы "прибить" таймеры.
2. В меню "Вид" выбрать "Инженерный".
3. Перезапустить программу.

Если же и в этом случае всё получилось, то можно также уменьшить период 1-го таймера с 1000, скажем до 500мс.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июл 14, 2018 1:37 pm 
Не в сети
доцент

Зарегистрирован: Пн июн 28, 2010 1:07 pm
Сообщений: 74
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Добрый день я пока с веб гаджетами работаю

пока вот лаконичная, сырая, болванка с некоторыми размерами окна


Цитата:
OpenWindow(#PB_Any, 0, 0, 1000, 600, "", #PB_Window_SystemMenu)
WebGadget = WebGadget(#PB_Any, 0, 35, 990, 590, "http://www.purebasic.fr/english/")


Repeat
Event = WindowEvent()
If Event = #PB_Event_Gadget And EventGadget()
EndIf

Until Event = #PB_Event_CloseWindow


Это не совсем мой код, это я взял у англоязычных мастеров, и я переделал его, там был клик по кнопке, это я убрал,

код получается слишком длинным и сложным, я обрезал все до локаничных размеров.

Мне нужен просто клик по конкретной ссылке, или просто тупо рандомный клик по площади внутри этого окна.
именно клик, а не машинный переход по ссылке.


допустим после открытого окна я хочу кликнуть мышкой по этому линку https://www.purebasic.fr/english/viewforum.php?f=16


Или просто по площадке с произвольными координатами.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июл 14, 2018 1:50 pm 
Не в сети
доцент

Зарегистрирован: Пн июн 28, 2010 1:07 pm
Сообщений: 74
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
просто когда добавляю эту команду,
например

Temp.POINT ; Это структура POINT
MouseX=Random(85,67) ; Куда кликать
MouseY=Random(95,67);
GetCursorPos_(@Temp) ; Текущая позиция курсора мышки
SetCursorPos_(MouseX, MouseY) ; Установка новой позиции курсора мышки

просто я не совсем понял, клики происходят внутри этого окна, или по общему экрану монитора компьютера,

вроде происходят внутри тела окна, но все же не совсем убедительно


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июл 14, 2018 6:55 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 420
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Цитата:
просто я не совсем понял, клики происходят внутри этого окна, или по общему экрану монитора компьютера,

по всему экрану. А для того чтобы ограничиться окном/гаджетом, перечитай пожалуйста эту страницу... ну и коды соответственно посмотри. А лучше справку по:
WindowX(), WindowY(), WindowWidth(), WindowHeight(), GadgetX(), GadgetY(), GadgetWidth(), GadgetHeight().
Это всё есть уже в версии 5.31, которую тебе и рекомендовал использовать kvitaliy.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июл 14, 2018 7:55 pm 
Не в сети
доцент

Зарегистрирован: Пн июн 28, 2010 1:07 pm
Сообщений: 74
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
knower писал(а):
Цитата:
просто я не совсем понял, клики происходят внутри этого окна, или по общему экрану монитора компьютера,

по всему экрану. А для того чтобы ограничиться окном/гаджетом, перечитай пожалуйста эту страницу... ну и коды соответственно посмотри. А лучше справку по:
WindowX(), WindowY(), WindowWidth(), WindowHeight(), GadgetX(), GadgetY(), GadgetWidth(), GadgetHeight().
Это всё есть уже в версии 5.31, которую тебе и рекомендовал использовать kvitaliy.


Спасибо


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс июл 15, 2018 3:00 am 
Не в сети
док

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 183
Благодарил (а): 19 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Xland писал(а):
я пока с веб гаджетами работаю
началось с движухи, закончилось веб-гаджетом. Автоматизация окна и веб-объекта не одно и тоже.
Посмотри автоматизацию веба на AutoIt3, чтобы немного представлять, что это типа API по работе с конкретным объектом.
Задачи и решения (AutoIt3)
функции веб-автоматизации (AutoIt3)

И если нужен аналог на PureBasic, то наверно тоже придётся найти тему по работе с объектом IE.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB