au3 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/AutoItX3/au3.rb +3 -5
- data/lib/AutoItX3/control.rb +511 -44
- data/lib/AutoItX3/filedir.rb +68 -21
- data/lib/AutoItX3/graphic.rb +29 -5
- data/lib/AutoItX3/keyboard.rb +18 -4
- data/lib/AutoItX3/misc.rb +85 -28
- data/lib/AutoItX3/mouse.rb +82 -16
- data/lib/AutoItX3/process.rb +116 -51
- data/lib/AutoItX3/window.rb +346 -61
- data/lib/AutoItX3/window/send_message.rb +271 -0
- data/lib/HISTORY.rdoc +10 -0
- data/lib/README.rdoc +26 -1
- data/lib/au3.rb +6 -0
- data/test/test_misc.rb +2 -1
- data/test/test_window_messages.rb +42 -0
- metadata +42 -16
data/lib/AutoItX3/process.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#Encoding: UTF-8
|
2
2
|
#This file is part of au3.
|
3
|
-
#Copyright © 2009 Marvin Gülker
|
3
|
+
#Copyright © 2009, 2010 Marvin Gülker, Steven Heidel
|
4
4
|
#
|
5
5
|
#au3 is published under the same terms as Ruby.
|
6
6
|
#See http://www.ruby-lang.org/en/LICENSE.txt
|
@@ -36,7 +36,18 @@ module AutoItX3
|
|
36
36
|
#call-seq:
|
37
37
|
# close_process(pid) ==> nil
|
38
38
|
# kill_process(pid) ==> nil
|
39
|
+
#
|
39
40
|
#Closes the given process.
|
41
|
+
#===Parameters
|
42
|
+
#[+pid+] The PID or name of the process to close.
|
43
|
+
#===Return value
|
44
|
+
#nil.
|
45
|
+
#===Example
|
46
|
+
# AutoItX3.close_process(1234)
|
47
|
+
#===Remarks
|
48
|
+
#This method doesn't ask the process to terminate nicely, it just kills it.
|
49
|
+
#If you're familiar with Unix process signals, this method is nearer to
|
50
|
+
#sending SIGKILL than sending SIGTERM.
|
40
51
|
def close_process(pid)
|
41
52
|
@functions[__method__] ||= AU3_Function.new("ProcessClose", 'S', 'L')
|
42
53
|
@functions[__method__].call(pid.to_s.wide)
|
@@ -44,20 +55,35 @@ module AutoItX3
|
|
44
55
|
end
|
45
56
|
alias kill_process close_process
|
46
57
|
|
47
|
-
#Checks wheather or not the given name or PID exists.
|
48
|
-
|
58
|
+
#Checks wheather or not the given name or PID exists.
|
59
|
+
#===Parameters
|
60
|
+
#[+pid+] The PID or name of the process to check.
|
61
|
+
#===Return value
|
62
|
+
#false if the process doesn't exist, otherwise the PID of the process.
|
63
|
+
#===Example
|
64
|
+
# p AutoItX3.process_exists?(1234) #=> false
|
65
|
+
# p AutoItX3.process_exists("ruby.exe") #=> 4084
|
49
66
|
def process_exists?(pid)
|
50
67
|
@functions[__method__] ||= AU3_Function.new("ProcessExists", 'S', 'L')
|
51
68
|
pid = @functions[__method__].call(pid.to_s.wide)
|
52
|
-
|
53
|
-
false
|
54
|
-
else
|
55
|
-
pid
|
56
|
-
end
|
57
|
-
|
69
|
+
pid > 0 && pid
|
58
70
|
end
|
59
71
|
|
60
|
-
#Sets a process's priority.
|
72
|
+
#Sets a process's priority.
|
73
|
+
#===Parameters
|
74
|
+
#[+pid+] The PID or name of the process whose priority you want to change.
|
75
|
+
#[+priority+] One of the *_PRIORITY constants.
|
76
|
+
#===Return value
|
77
|
+
#The argument passed as +priority+.
|
78
|
+
#===Raises
|
79
|
+
#[Au3Error] You passed an invalid priority value or some other error occured.
|
80
|
+
#===Example
|
81
|
+
# AutoItX3.set_process_priority(4084, AutoItX3::HIGH_PRIORITY)
|
82
|
+
# AutoItX3.set_process_priority("ruby.exe", AutoItX3::SUBNORMAL_PRIORITY)
|
83
|
+
#===Remarks
|
84
|
+
#You shouldn't set a process's priority to REALTIME_PRIORITY, since that
|
85
|
+
#is the priority system processes run with which are likely more important than your process.
|
86
|
+
#The same goes the other way round: Don't decrease a system process's priority.
|
61
87
|
def set_process_priority(pid, priority)
|
62
88
|
@functions[__method__] ||= AU3_Function.new("ProcessSetPriority", 'SL', 'L')
|
63
89
|
@functions[__method__].call(pid.to_s.wide, priority)
|
@@ -70,37 +96,54 @@ module AutoItX3
|
|
70
96
|
end
|
71
97
|
end
|
72
98
|
|
73
|
-
#Waits for the given process name to exist.
|
74
|
-
|
75
|
-
#
|
76
|
-
#
|
77
|
-
|
99
|
+
#Waits for the given process name to exist.
|
100
|
+
#===Parameters
|
101
|
+
#[+procname+] The name of the process to wait for.
|
102
|
+
#[+timeout+] (+0+) The time to wait, in seconds. The default is to wait infinitely.
|
103
|
+
#===Return value
|
104
|
+
#true if the process was found, false if +timeout+ was reached.
|
105
|
+
#===Example
|
106
|
+
# AutoItX3.wait_for_process("nonexistant.exe", 2) #| false
|
107
|
+
# AutoItX3.wait_for_process("ruby.exe") #| true
|
108
|
+
#===Remarks
|
109
|
+
#This is the only process-related method that doesn't take a PID,
|
110
|
+
#because to wait for a special PID doesn't make sense, since PIDs
|
111
|
+
#are generated randomly.
|
78
112
|
def wait_for_process(procname, timeout = 0)
|
79
113
|
@functions[__method__] ||= AU3_Function.new("ProcessWait", 'SL', 'L')
|
80
|
-
|
81
|
-
false
|
82
|
-
else
|
83
|
-
true
|
84
|
-
end
|
114
|
+
@functions[__method__].call(procname.to_s.wide, timeout) == 1
|
85
115
|
end
|
86
116
|
|
87
117
|
#Waits for the given process name or PID to disappear.
|
88
|
-
|
89
|
-
#
|
118
|
+
#===Parameters
|
119
|
+
#[+pid+] The PID or process name to wait for.
|
120
|
+
#[+timeout+] The time to wait, in seconds. 0 means to wait infinitely, which is the default.
|
121
|
+
#===Return value
|
122
|
+
#true if the process disappeared, false if +timeout+ was reached.
|
123
|
+
#===Example
|
124
|
+
# AutoItX3.wait_for_process_close(4084) #| true
|
125
|
+
# AutoItX3.wait_for_process_close("ruby.exe", 1) #| false
|
126
|
+
# #Attention on this one:
|
127
|
+
# AutoItX3.wait_for_process_close("nonexistant.exe") #| true
|
90
128
|
def wait_for_process_close(pid, timeout = 0)
|
91
129
|
@functions[__method__] ||= AU3_Function.new("ProcessWaitClose", 'SL', 'L')
|
92
|
-
|
93
|
-
false
|
94
|
-
else
|
95
|
-
true
|
96
|
-
end
|
130
|
+
@functions[__method__].call(pid.to_s.wide, timeout) == 1
|
97
131
|
end
|
98
132
|
|
99
|
-
#Runs a program.
|
133
|
+
#Runs a program.
|
134
|
+
#===Parameters
|
135
|
+
#[+name+] The command to run.
|
136
|
+
#[+workingdir+] (<tt>""</tt>) The working directory to start the process in. Default is the current one.
|
137
|
+
#[+flag+] (+1+) Additional properties you want to set on the window. Possible value include SW_HIDE, SW_MINIMIZE and SW_MAXIMIZE, which are defined as constants of the Window class. Default is to set nothing.
|
138
|
+
#===Return value
|
139
|
+
#The PID of the newly created process.
|
140
|
+
#===Raises
|
141
|
+
#[Au3Error] Couldn't awake the specified program.
|
142
|
+
#===Example
|
143
|
+
# p AutoItX3.run("notepad.exe") #=> 502
|
144
|
+
#===Remarks
|
145
|
+
#The program flow continues; if you want to wait for the process to
|
100
146
|
#finish, use #run_and_wait.
|
101
|
-
#Returns the PID of the created process or nil if there was a failure starting the process.
|
102
|
-
#The +flag+ parameter can be one of the SW_HIDE, SW_MINIMZE or SW_MAXIMIZE
|
103
|
-
#constants in the Window class.
|
104
147
|
def run(name, workingdir = "", flag = 1)
|
105
148
|
@functions[__method__] ||= AU3_Function.new("Run", 'SSL', 'L')
|
106
149
|
pid = @functions[__method__].call(name.wide, workingdir.wide, flag)
|
@@ -108,11 +151,23 @@ module AutoItX3
|
|
108
151
|
pid
|
109
152
|
end
|
110
153
|
|
111
|
-
#Runs a program
|
112
|
-
|
113
|
-
#
|
114
|
-
#
|
115
|
-
#constants
|
154
|
+
#Runs a program and waits until the process has finished.
|
155
|
+
#===Parameters
|
156
|
+
#[+name+] The command to run.
|
157
|
+
#[+workingdir+] (<tt>""</tt>) The working directory to start the process in. Default is the current one.
|
158
|
+
#[+flag+] (+1+) Additional properties you want to set on the window. Possible value include SW_HIDE, SW_MINIMIZE and SW_MAXIMIZE, which are defined as constants of the Window class. Default is to set nothing.
|
159
|
+
#===Return value
|
160
|
+
#The exitcode of the process.
|
161
|
+
#===Raises
|
162
|
+
#[Au3Error] Couldn't awake the specified program.
|
163
|
+
#===Example
|
164
|
+
# AutoItX3.run_and_wait("ipconfig") #| 0
|
165
|
+
# AutoItX3.run_and_wait("nonexistant.exe")
|
166
|
+
#===Remarks
|
167
|
+
#If you don't want to wait until the program has finished, use #run.
|
168
|
+
#
|
169
|
+
#This method doesn't do anything different from Ruby's own Kernel#system method beside
|
170
|
+
#the flag you can pass to GUI applications.
|
116
171
|
def run_and_wait(name, workingdir = "", flag = 1)
|
117
172
|
@functions[__method__] ||= AU3_Function.new("RunWait", 'SSL', 'L')
|
118
173
|
exitcode = @functions[__method__].call(name.wide, workingdir.wide, flag)
|
@@ -121,7 +176,19 @@ module AutoItX3
|
|
121
176
|
end
|
122
177
|
|
123
178
|
#Changes the the owner of following #run and #run_and_wait methods to the given
|
124
|
-
#user.
|
179
|
+
#user.
|
180
|
+
#===Parameters
|
181
|
+
#[+username+] The name of the user you want to run commands as.
|
182
|
+
#[+domain+] The user's domain.
|
183
|
+
#[+password+] The user's password.
|
184
|
+
#[+options+] (+1+) One of the following: 0: don't load the user profile, 1 (default): load the user profile, 2: Only for networking.
|
185
|
+
#===Return value
|
186
|
+
#nil.
|
187
|
+
#===Raises
|
188
|
+
#[NotImplementedError] You're using Windows ME or earlier which don't support this method.
|
189
|
+
#===Example
|
190
|
+
# AutoItX3.run_as_set("Rubyist", "WORKGROUP", "MyFamousUncrackablePassword")
|
191
|
+
# AutoItX3.run("hack_them_all.exe")
|
125
192
|
def run_as_set(username, domain, password, options = 1)
|
126
193
|
@functions[__method__] ||= AU3_Function.new("RunAsSet", 'SSSI', 'L')
|
127
194
|
if @functions[__method__].call(username.wide, domain.wide, password.wide, options) == 0
|
@@ -130,23 +197,21 @@ module AutoItX3
|
|
130
197
|
nil
|
131
198
|
end
|
132
199
|
|
133
|
-
#
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
#
|
138
|
-
|
139
|
-
|
140
|
-
|
200
|
+
#Shuts down or reboots your computer, or logs you off.
|
201
|
+
#===Parameters
|
202
|
+
#[+code+] One of the following constants: SHUTDOWN, REBOOT, LOGOFF. You may combine (by using addition with +) each of them with FORCE_CLOSE which forces all hanging applications to close. Additionally, you may combine SHUTDOWN with POWEROFF which ensures that your computer gets cut off from the power supply.
|
203
|
+
#===Return value
|
204
|
+
#Unknown.
|
205
|
+
#===Example
|
206
|
+
# AutoItX3.shutdown(AutoItX3::LOGOFF | AutoItX3::FORCE_CLOSE)
|
207
|
+
# AutoItX3.shutdown(AutoItX3::REBOOT)
|
208
|
+
# AutoItX3.shutdown(AutoItX3::SHUTDOWN + AutoItX3::FORCE_CLOSE + AutoItX3::POWEROFF)
|
209
|
+
# #If your computer is still running after executing this sequence of commands, you may should check your hardware.
|
141
210
|
def shutdown(code)
|
142
211
|
@functions[__method__] ||= AU3_Function.new("Shutdown", 'L', 'L')
|
143
|
-
|
144
|
-
false
|
145
|
-
else
|
146
|
-
true
|
147
|
-
end
|
212
|
+
@functions[__method__].call(code) == 1
|
148
213
|
end
|
149
214
|
|
150
215
|
end
|
151
216
|
|
152
|
-
end
|
217
|
+
end
|
data/lib/AutoItX3/window.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#Encoding: UTF-8
|
2
2
|
#This file is part of au3.
|
3
|
-
#Copyright © 2009 Marvin Gülker
|
3
|
+
#Copyright © 2009, 2010 Marvin Gülker, Steven Heidel
|
4
4
|
#
|
5
5
|
#au3 is published under the same terms as Ruby.
|
6
6
|
#See http://www.ruby-lang.org/en/LICENSE.txt
|
@@ -12,6 +12,19 @@ module AutoItX3
|
|
12
12
|
#If you want to get a real handle to the window,
|
13
13
|
#call #handle on your Window object (but you won't
|
14
14
|
#need that unless you want to use it for Win32 API calls).
|
15
|
+
#
|
16
|
+
#Every window is clearly defined by two properties: The window't title
|
17
|
+
#(or at least a part of it, see AutoItX3.opts) and it's text.
|
18
|
+
#In most cases you can ignore the text, since a window's title is usually
|
19
|
+
#enough to identify a window, but if you're only using parts of titles, you may have
|
20
|
+
#to check texts as well, but be prepared that the "text" a window holds
|
21
|
+
#doesn't have to correspond with the text you actually see on the window.
|
22
|
+
#If you set a method's +text+ parameter to an empty string (which is the default),
|
23
|
+
#a window will only be searched for by title.
|
24
|
+
#
|
25
|
+
#Please also note that the handle a Window object holds gets invalid if the window it
|
26
|
+
#refers to is closed. This class doesn't automatically notify you if that occures, so
|
27
|
+
#don't wonder about "window not found" errors after a window was closed.
|
15
28
|
class Window
|
16
29
|
|
17
30
|
#A window describing the desktop.
|
@@ -48,18 +61,28 @@ module AutoItX3
|
|
48
61
|
end
|
49
62
|
|
50
63
|
#Checks if a window with the given properties exists.
|
64
|
+
#===Parameters
|
65
|
+
#[+title+] The window's title.
|
66
|
+
#[+text+] (<tt>""</tt>) The window's text.
|
67
|
+
#===Return value
|
68
|
+
#true or false.
|
69
|
+
#===Example
|
70
|
+
# p AutoItX3::Window.exists?("Untitled - notepad") #=> true
|
71
|
+
# p AutoItX3::Window.exists?("Nonexistant") #=> false
|
51
72
|
def exists?(title, text = "")
|
52
73
|
@functions[__method__] ||= AU3_Function.new("WinExists", 'SS', 'L')
|
53
|
-
|
54
|
-
return false;
|
55
|
-
else
|
56
|
-
return true;
|
57
|
-
end
|
74
|
+
@functions[__method__].call(title.wide, text.wide) == 1
|
58
75
|
end
|
59
76
|
|
60
|
-
#Returns
|
61
|
-
|
62
|
-
#
|
77
|
+
#Returns the position of the caret in the active window.
|
78
|
+
#===Return value
|
79
|
+
#A two-element array of form <tt>[x , y]</tt>, which are meant to be row and column, not pixel values.
|
80
|
+
#===Example
|
81
|
+
# p AutoItX3::Window.caret_pos #=> [8, 28]
|
82
|
+
#===Remarks
|
83
|
+
#This doesn't work with every window. Many MDI windows, for example, use absolute coordinates and yet other always report static coordinates.
|
84
|
+
#
|
85
|
+
#The caret is the blinking pipe cursor that is displayed when editing lines of text (it has nothing to do with the mouse cursor).
|
63
86
|
def caret_pos
|
64
87
|
@functions[:caret_pos_x] ||= AU3_Function.new("WinGetCaretPosX", '', 'L')
|
65
88
|
@functions[:caret_pos_y] ||= AU3_Function.new("WinGetCaretPosY", '', 'L')
|
@@ -69,6 +92,10 @@ module AutoItX3
|
|
69
92
|
end
|
70
93
|
|
71
94
|
#Minimizes all available windows.
|
95
|
+
#===Return value
|
96
|
+
#nil.
|
97
|
+
#===Example
|
98
|
+
# AutoItX3::Window.minimize_all
|
72
99
|
def minimize_all
|
73
100
|
@functions[__method__] ||= AU3_Function.new("WinMinimizeAll", '')
|
74
101
|
@functions[__method__].call
|
@@ -76,15 +103,28 @@ module AutoItX3
|
|
76
103
|
end
|
77
104
|
|
78
105
|
#Undoes a previous call to Window.minimize_all.
|
106
|
+
#===Return value
|
107
|
+
#nil.
|
108
|
+
#===Example
|
109
|
+
# AutoItX3::Window.minimize_all
|
110
|
+
# sleep 3
|
111
|
+
# AutoItX3::Window.undo_minimize_all
|
79
112
|
def undo_minimize_all
|
80
113
|
@functions[__method__] ||= AU3_Function.new("WinMinimizeAllUndo", '')
|
81
114
|
@functions[__method__].call
|
82
115
|
nil
|
83
116
|
end
|
84
117
|
|
85
|
-
#Waits for a window with the given properties to exist.
|
86
|
-
|
87
|
-
#
|
118
|
+
#Waits for a window with the given properties to exist.
|
119
|
+
#===Parameters
|
120
|
+
#[+title+] The title of the window to wait for.
|
121
|
+
#[+text+] (<tt>""</tt> The text of the window to wait for.
|
122
|
+
#[+timeout+] (+0+) The time to wait for, in seconds. Zero means to wait infinitely.
|
123
|
+
#===Return value
|
124
|
+
#true if the window has been found, false if +timeout+ was reached.
|
125
|
+
#===Example
|
126
|
+
# AutoItX3::Window.wait("Untitled - Notepad") #| true
|
127
|
+
# AutoItX3::Window.wait("Nonexistant", 3) #| false
|
88
128
|
def wait(title, text = "", timeout = 0)
|
89
129
|
@functions[__method__] ||= AU3_Function.new("WinWait", 'SSL', 'L')
|
90
130
|
@functions[__method__].call(title.wide, text.wide, timeout) != 0
|
@@ -92,11 +132,16 @@ module AutoItX3
|
|
92
132
|
|
93
133
|
end
|
94
134
|
|
95
|
-
#Creates a new Window object.
|
96
|
-
|
97
|
-
#
|
98
|
-
#
|
99
|
-
|
135
|
+
#Creates a new Window object.
|
136
|
+
#===Parameters
|
137
|
+
#[+title+] The title of the window you want a reference to. Use DESKTOP_WINDOW for a handle to the desktop and ACTIVE_WINDOW for a handle to the currently selected window.
|
138
|
+
#[+text+] The text of the window you want a reference to.
|
139
|
+
#===Return value
|
140
|
+
#The newly created Window object.
|
141
|
+
#===Raises
|
142
|
+
#[Au3Error] No window with the given properties was found.
|
143
|
+
#===Example
|
144
|
+
# win = AutoItX3::Window.new("Untitled - Notepad")
|
100
145
|
def initialize(title, text = "")
|
101
146
|
@title = title
|
102
147
|
@text = text
|
@@ -105,22 +150,35 @@ module AutoItX3
|
|
105
150
|
|
106
151
|
#Human-readable output of form <tt>"<Window: WINDOW_TITLE (WINDOW_HANDLE)>"</tt>.
|
107
152
|
#The title is determined by calling #title.
|
108
|
-
def inspect
|
153
|
+
def inspect # :nodoc:
|
109
154
|
"<Window: #{title} (#{handle})>"
|
110
155
|
end
|
111
156
|
|
112
|
-
#Returns
|
157
|
+
#Returns the window's title.
|
158
|
+
#===Return value
|
159
|
+
#+self+'s title by (the value of <tt>@title</tt>).
|
160
|
+
#===Example
|
161
|
+
# puts win.to_s #=> Untitled - Notepad
|
113
162
|
def to_s
|
114
163
|
@title
|
115
164
|
end
|
116
165
|
|
117
|
-
#Returns the handle of the window
|
118
|
-
|
166
|
+
#Returns the actual handle of the window.
|
167
|
+
#===Return value
|
168
|
+
#The window's handle as an integer.
|
169
|
+
#===Example
|
170
|
+
# p win.handle #=> 721996
|
171
|
+
#===Remarks
|
172
|
+
#See also #handle.
|
119
173
|
def to_i
|
120
174
|
handle.to_i(16)
|
121
175
|
end
|
122
176
|
|
123
177
|
#Activates the window and returns true if it was successfully activated (using #active? to check).
|
178
|
+
#===Return value
|
179
|
+
#true if the window is activated now, otherwise false.
|
180
|
+
#===Example
|
181
|
+
# win.activate
|
124
182
|
def activate
|
125
183
|
Window.functions[__method__] ||= AU3_Function.new("WinActivate", 'SS')
|
126
184
|
Window.functions[__method__].call(@title.wide, @text.wide)
|
@@ -128,16 +186,24 @@ module AutoItX3
|
|
128
186
|
end
|
129
187
|
|
130
188
|
#Checks wheather or not the window is active.
|
189
|
+
#===Return value
|
190
|
+
#true if the window is active, otherwise false.
|
191
|
+
#===Example
|
192
|
+
# p win.active? #=> false
|
193
|
+
# win.activate #| true
|
194
|
+
# p win.active? #=> true
|
131
195
|
def active?
|
132
196
|
Window.functions[__method__] ||= AU3_Function.new("WinActive", 'SS', 'L')
|
133
|
-
|
134
|
-
return false
|
135
|
-
else
|
136
|
-
return true
|
137
|
-
end
|
197
|
+
Window.functions[__method__].call(@title.wide, @text.wide) == 1
|
138
198
|
end
|
139
199
|
|
140
|
-
#Sends WM_CLOSE to +self+.
|
200
|
+
#Sends WM_CLOSE to +self+. This is like clicking on the [X] button on top of the window.
|
201
|
+
#===Return value
|
202
|
+
#nil.
|
203
|
+
#===Example
|
204
|
+
# win.close
|
205
|
+
#===Remarks
|
206
|
+
#WM_CLOSE may be processed by the window,
|
141
207
|
#it could, for example, ask to save or the like. If you want to kill a window
|
142
208
|
#without giving the ability to process your message, use the #kill method.
|
143
209
|
def close
|
@@ -151,12 +217,25 @@ module AutoItX3
|
|
151
217
|
# valid? ==> true or false
|
152
218
|
#
|
153
219
|
#Calls the Window.exists? class method with the values given in Window.new.
|
220
|
+
#===Return value
|
221
|
+
#true if this object refers to an existing window, false otherwise.
|
222
|
+
#===Example
|
223
|
+
# p win.exists? #=> true
|
224
|
+
# win.close
|
225
|
+
# p win.exists? #=> false
|
154
226
|
def exists?
|
155
227
|
Window.exists?(@title, @text)
|
156
228
|
end
|
157
229
|
alias valid? exists?
|
158
230
|
|
159
|
-
|
231
|
+
#Returns an array of all used window classes of +self+.
|
232
|
+
#===Return value
|
233
|
+
#An array containg all the window classes as strings.
|
234
|
+
#===Raises
|
235
|
+
#[Au3Error] Window not found.
|
236
|
+
#===Example
|
237
|
+
# p win.class_list
|
238
|
+
# #=> ["SciTEWindowContent", "Scintilla", "Scintilla", "ToolbarWindow32", "SciTeTabCtrl", "msctls_statusbar32"]
|
160
239
|
def class_list
|
161
240
|
Window.functions[__method__] ||= AU3_Function.new("WinGetClassList", 'SSPI')
|
162
241
|
buffer = " " * AutoItX3::BUFFER_SIZE
|
@@ -166,20 +245,34 @@ module AutoItX3
|
|
166
245
|
buffer.normal.split("\n").map{|str| str.strip.empty? ? nil : str.strip}.compact
|
167
246
|
end
|
168
247
|
|
169
|
-
#
|
170
|
-
|
248
|
+
#Gets the size of a window's client area.
|
249
|
+
#===Return value
|
250
|
+
#A two-element array of form <tt>[ width , height ]</tt>. Returns <tt>[0, 0]</tt> on minimized
|
171
251
|
#windows.
|
252
|
+
#===Raises
|
253
|
+
#[Au3Error] Window not found.
|
254
|
+
#===Example
|
255
|
+
# p win.client_size #=> [784, 564]
|
256
|
+
# #Minimized:
|
257
|
+
# p win.client_size #=> [0, 0]
|
172
258
|
def client_size
|
173
259
|
Window.functions[:client_size_width] ||= AU3_Function.new("WinGetClientSizeWidth", 'SS', 'L')
|
174
260
|
Window.functions[:client_size_height] ||= AU3_Function.new("WinGetClientSizeHeight", 'SS', 'L')
|
175
|
-
size = [Window.functions[:client_size_width].call, Window.functions[:client_size_height].call]
|
261
|
+
size = [Window.functions[:client_size_width].call(@title.wide, @text.wide), Window.functions[:client_size_height].call(@title.wide, @text.wide)]
|
176
262
|
raise_unfound if AutoItX3.last_error == 1
|
177
263
|
size
|
178
264
|
end
|
179
265
|
|
180
|
-
#Returns the
|
181
|
-
|
182
|
-
#
|
266
|
+
#Returns the handle of a window.
|
267
|
+
#===Return value
|
268
|
+
#Returns the numeric handle of a window as a string.
|
269
|
+
#===Raises
|
270
|
+
#[Au3Error] Window not found.
|
271
|
+
#===Example
|
272
|
+
# p win.handle #=> "00070388"
|
273
|
+
#===Remarks
|
274
|
+
#You may use the handle for instead of passing a title to Window.new or directly for
|
275
|
+
#Win32API calls (make sure you call <tt>.to_i(16)</tt> on the string before).
|
183
276
|
def handle
|
184
277
|
Window.functions[__method__] ||= AU3_Function.new("WinGetHandle", 'SSPI')
|
185
278
|
buffer = " " * AutoItX3::BUFFER_SIZE
|
@@ -189,8 +282,18 @@ module AutoItX3
|
|
189
282
|
buffer.normal.strip
|
190
283
|
end
|
191
284
|
|
285
|
+
#Gets a window's rectangle.
|
286
|
+
#===Return value
|
192
287
|
#Returns the position and size of +self+ in a four-element array
|
193
|
-
#of form <tt>[x, y, width, height]</tt>.
|
288
|
+
#of form <tt>[x, y, width, height]</tt>. If called on a minimized window,
|
289
|
+
#the X and Y values are nonsense, but +width+ and +height+ indicate the
|
290
|
+
#size of the window's bar in the taskbar.
|
291
|
+
#===Raises
|
292
|
+
#[Au3Error] Window not found.
|
293
|
+
#===Example
|
294
|
+
# p win.rect #=> [240, 191, 800, 600]
|
295
|
+
# #Called on a minimized window:
|
296
|
+
# p win.rect #=> [4294935296, 4294935296, 160, 25]
|
194
297
|
def rect
|
195
298
|
Window.functions[:xpos] ||= AU3_Function.new("WinGetPosX", 'SS', 'L')
|
196
299
|
Window.functions[:ypos] ||= AU3_Function.new("WinGetPosY", 'SS', 'L')
|
@@ -210,8 +313,14 @@ module AutoItX3
|
|
210
313
|
rect
|
211
314
|
end
|
212
315
|
|
316
|
+
#Gets the PID of the process running a window.
|
317
|
+
#===Return value
|
213
318
|
#Returns the process identification number of +self+'s window
|
214
319
|
#procedure.
|
320
|
+
#===Raises
|
321
|
+
#[Au3Error] Window not found.
|
322
|
+
#===Example
|
323
|
+
# p win.pid #=> 3128
|
215
324
|
def pid
|
216
325
|
Window.functions[__method__] ||= AU3_Function.new("WinGetProcess", 'SSPI', 'L')
|
217
326
|
buffer = " " * AutoItX3::BUFFER_SIZE
|
@@ -226,7 +335,10 @@ module AutoItX3
|
|
226
335
|
end
|
227
336
|
end
|
228
337
|
|
229
|
-
#
|
338
|
+
#Checks a window's state. You shouldn't use this function, use #exists?,
|
339
|
+
##visible?, #enabled?, #active?, #minimized? and #maximized? instead.
|
340
|
+
#===Return value
|
341
|
+
#Returns the integer composition of the states:
|
230
342
|
#- exists (1)
|
231
343
|
#- visible (2)
|
232
344
|
#- enabled (4)
|
@@ -234,8 +346,12 @@ module AutoItX3
|
|
234
346
|
#- minimized (16)
|
235
347
|
#- maximized (32)
|
236
348
|
#Use the bit-wise AND operator & to check for a specific state.
|
237
|
-
|
238
|
-
|
349
|
+
#===Raises
|
350
|
+
#[Au3Error] Window not found.
|
351
|
+
#===Example
|
352
|
+
# #Check for visibility
|
353
|
+
# p(win.state & 2) #=> 2 #visible
|
354
|
+
# p(win.state & 2) #=> 0 #invisible
|
239
355
|
def state
|
240
356
|
Window.functions[__method__] ||= AU3_Function.new("WinGetState", 'SS', 'L')
|
241
357
|
state = Window.functions[__method__].call(@title.wide, @text.wide)
|
@@ -243,28 +359,59 @@ module AutoItX3
|
|
243
359
|
state
|
244
360
|
end
|
245
361
|
|
246
|
-
#
|
362
|
+
#Checks wheather a window is visible or not.
|
363
|
+
#===Return value
|
364
|
+
#Returns true if +self+ is shown on the screen, false otherwise.
|
365
|
+
#===Raises
|
366
|
+
#[Au3Error] Window not found.
|
367
|
+
#===Example
|
368
|
+
# p win.visible? #=> true
|
247
369
|
def visible?
|
248
370
|
(state & 2) == 2
|
249
371
|
end
|
250
372
|
|
251
|
-
#
|
373
|
+
#Checks wheather a window can receive user input or not.
|
374
|
+
#===Return value
|
375
|
+
#Returns true if +self+ is enabled, false otherwise.
|
376
|
+
#===Raises
|
377
|
+
#[Au3Error] Window not found.
|
378
|
+
#===Example
|
379
|
+
# p win.enabled? #=> false
|
252
380
|
def enabled?
|
253
381
|
(state & 4) == 4
|
254
382
|
end
|
255
383
|
|
256
|
-
#
|
384
|
+
#Checks wheather or not a window is minimized to the taskbar.
|
385
|
+
#===Return value
|
386
|
+
#Returns true if +self+ is minimized to the taskbar, false otherwise.
|
387
|
+
#===Raises
|
388
|
+
#[Au3Error] Window not found.
|
389
|
+
#===Example
|
390
|
+
# p win.minimized? #=> true
|
257
391
|
def minimized?
|
258
392
|
(state & 16) == 16
|
259
393
|
end
|
260
394
|
|
395
|
+
#Checks wheather or not this is a fullscreen window.
|
396
|
+
#===Return value
|
261
397
|
#Returns true if +self+ is maximized to full screen size.
|
398
|
+
#===Raises
|
399
|
+
#[Au3Error] Window not found.
|
400
|
+
#===Example
|
401
|
+
# p win.maximized? #=> false
|
262
402
|
def maximized?
|
263
403
|
(state & 32) == 32
|
264
404
|
end
|
265
405
|
|
266
406
|
#Returns the text read from a window. This method doesn't query the @text instance
|
267
407
|
#variable, rather it calls the AU3_WinGetText function.
|
408
|
+
#===Return value
|
409
|
+
#The window's text. It doesn't necassary make sense.
|
410
|
+
#===Example
|
411
|
+
# #Used on an explorer window:
|
412
|
+
# p win.text #=> "Navigationsleiste\nAdresse: C:\\Users\\marvin_g\\Desktop\\Automations\\au3\\trunk\\lib\nlib\nHostwrapper f├╝r gemeinsame Orte\nShellView\nFolderView\nMen├╝leiste"
|
413
|
+
# #Some windows just don't have any text.
|
414
|
+
# p win.text #=> ""
|
268
415
|
def text
|
269
416
|
Window.functions[__method__] ||= AU3_Function.new("WinGetText", 'SSPI')
|
270
417
|
buffer = " " * AutoItX3::BUFFER_SIZE
|
@@ -277,6 +424,10 @@ module AutoItX3
|
|
277
424
|
#affect or even use the value of @title, that means you can use
|
278
425
|
#+title+ to retrieve titles from a window if you're working with the
|
279
426
|
#advanced window mode.
|
427
|
+
#===Return value
|
428
|
+
#The window's title.
|
429
|
+
#===Example
|
430
|
+
# p win.title #=> "AutoItX Help"
|
280
431
|
def title
|
281
432
|
Window.functions[__method__] ||= AU3_Function.new("WinGetTitle", 'SSPI')
|
282
433
|
buffer = " " * AutoItX3::BUFFER_SIZE
|
@@ -287,26 +438,64 @@ module AutoItX3
|
|
287
438
|
|
288
439
|
#Kills +self+. This method forces a window to close if it doesn't close
|
289
440
|
#quickly enough (in contrary to #close which waits for user actions
|
290
|
-
#if neccessary).
|
291
|
-
|
441
|
+
#if neccessary).
|
442
|
+
#===Return value
|
443
|
+
#nil.
|
444
|
+
#===Example
|
445
|
+
# win.kill
|
446
|
+
# p win.exists? #=> false
|
447
|
+
#===Remarks
|
448
|
+
#Some windows cannot be +kill+ed (notably Windows Explorer windows).
|
292
449
|
def kill
|
293
450
|
Window.functions[__method__] ||= AU3_Function.new("WinKill", 'SS', 'L')
|
294
451
|
Window.functions[__method__].call(@title.wide, @text.wide)
|
295
452
|
nil
|
296
453
|
end
|
297
454
|
|
298
|
-
#Clicks
|
299
|
-
|
455
|
+
#Clicks a menu entry.
|
456
|
+
#===Parameters
|
457
|
+
#[+menu+] The name of the top menu, such as <tt>"File"</tt> (or rather <tt>"&File"</tt>; you have to prefix underlined letters with an ampersand sign &).
|
458
|
+
#[<tt>*items</tt>] Up to 7 submenus, use this in the same matter as +menu+.
|
459
|
+
#===Return value
|
460
|
+
#nil.
|
461
|
+
#===Raises
|
462
|
+
#[Au3Error] Window not found.
|
463
|
+
#===Example
|
464
|
+
# #Open the "Help" entry in SciTE's "Help" menu:
|
465
|
+
# win.select_menu_item("&Help", "&Help")
|
466
|
+
#===Remarks
|
467
|
+
#You can't open a menu with this method, the last submenu has to be associated with an action like opening a dialog window.
|
468
|
+
#
|
469
|
+
#If you experience troubles with entries containing three dots <tt>...</tt> you should check if those three dots aren't a
|
470
|
+
#Unicode character like Horizontal Ellipsis (<tt>…</tt>, U+2026). Just try that character instead of three dots.
|
300
471
|
def select_menu_item(menu, *items)
|
301
|
-
Window.
|
472
|
+
Window.functions[__method__] ||= AU3_Function.new("WinMenuSelectItem", 'SSSSSSSSSS', 'L')
|
302
473
|
raise(ArgumentError, "Wrong number of arguments, maximum is seven items!") if items.size > 7 #(menu is the 8th)
|
474
|
+
items[6] = nil if items.size < 7
|
475
|
+
items.map!{|item| item.nil? ? "" : item}
|
303
476
|
result = Window.functions[__method__].call(@title.wide, @text.wide, menu.wide, *items.map{|item| item.wide})
|
304
477
|
raise_unfound if result == 0
|
305
478
|
nil
|
306
479
|
end
|
307
480
|
|
308
|
-
#Moves a window (and optionally resizes it).
|
309
|
-
|
481
|
+
#Moves a window (and optionally resizes it).
|
482
|
+
#===Parameters
|
483
|
+
#[+x+] The X coordinate to move the window to.
|
484
|
+
#[+y+] The Y coordinate to move the window to.
|
485
|
+
#[+width+] (<tt>-1</tt>) The window's new width.
|
486
|
+
#[+height+] (<tt>-1</tt>) The window's new width.
|
487
|
+
#===Return value
|
488
|
+
#nil.
|
489
|
+
#===Example
|
490
|
+
# #Move a window to (10|10):
|
491
|
+
# win.move(10, 10)
|
492
|
+
# #Moves a windot to (100|100) and resizes it to 500 x 500:
|
493
|
+
# win.move(100, 100, 500, 500)
|
494
|
+
# #Since you can't resize a window without moving it, use this to achieve
|
495
|
+
# #the same effect:
|
496
|
+
# win.move(win.rect[0], win.rect[1], 700, 700)
|
497
|
+
#===Remarks
|
498
|
+
#This does not work with minimized and maximized windows.
|
310
499
|
def move(x, y, width = -1, height = -1)
|
311
500
|
Window.functions[__method__] ||= AU3_Function.new("WinMove", 'SSLLLL', 'L')
|
312
501
|
Window.functions[__method__].call(@title.wide, @text.wide, x, y, width, height)
|
@@ -314,23 +503,67 @@ module AutoItX3
|
|
314
503
|
end
|
315
504
|
|
316
505
|
#Turn the TOPMOST flag of +self+ on or off. If activated, the window
|
317
|
-
#will stay on top above all other windows.
|
506
|
+
#will stay on top above all other windows.
|
507
|
+
#===Parameters
|
508
|
+
#[+val+] true or false.
|
509
|
+
#===Return value
|
510
|
+
#The argument passed.
|
511
|
+
#===Example
|
512
|
+
# win.set_on_top = true
|
318
513
|
def set_on_top=(val)
|
319
514
|
Window.functions[__method__] ||= AU3_Function.new("WinSetOnTop", 'SSL', 'L')
|
320
515
|
Window.functions[__method__].call(@title.wide, @text.wide, !!val)
|
321
516
|
val
|
322
517
|
end
|
323
518
|
|
324
|
-
#Sets +self+
|
519
|
+
#Sets +self+ to a specific state like "maximized".
|
520
|
+
#===Parameters
|
521
|
+
#[+val+] The state the window should be set to. One of the SW_* constants of this class.
|
522
|
+
#===Return value
|
523
|
+
#The argument passed.
|
524
|
+
#===Example
|
525
|
+
# #Mimize a window
|
526
|
+
# win.state = AutoItX3::Window::SW_MINIMIZE
|
527
|
+
# #Make it fullscreen
|
528
|
+
# win.state = AutoItX3::Window::SW_MAXIMIZE
|
325
529
|
def state=(val)
|
326
530
|
Window.functions[__method__] ||= AU3_Function.new("WinSetState", 'SSL', 'L')
|
327
531
|
Window.functions[__method__].call(@title.wide, @text.wide, val)
|
328
532
|
val
|
329
533
|
end
|
330
534
|
|
331
|
-
#Renames +self+.
|
332
|
-
|
333
|
-
#
|
535
|
+
#Renames +self+.
|
536
|
+
#===Parameters
|
537
|
+
#[+val+] The new title.
|
538
|
+
#===Return value
|
539
|
+
#The argument passed.
|
540
|
+
#===Example
|
541
|
+
# win.title = "Use Ruby whenever you can"
|
542
|
+
#===Remarks
|
543
|
+
#This does not change the internal @title instance variable, so you can use this with the
|
544
|
+
#advanced window mode; this has another issue, though. If you aren't working in advanced
|
545
|
+
#window mode, you (pseudo) Ruby handle gets invalid, since it only references the window by title:
|
546
|
+
# irb(main):042:0> win.title = "xxx"
|
547
|
+
# => "xxx"
|
548
|
+
# irb(main):043:0> win
|
549
|
+
# AutoItX3::Au3Error: Unable to find a window with title 'lib' and text ''!
|
550
|
+
# from C:/Users/marvin_g/Desktop/Automations/au3/trunk/lib/AutoItX3/window
|
551
|
+
# .rb:265:in `handle'
|
552
|
+
# from C:/Users/marvin_g/Desktop/Automations/au3/trunk/lib/AutoItX3/window
|
553
|
+
# .rb:154:in `inspect'
|
554
|
+
# irb(main):044:0> win2 = AutoItX3::Window.new("xxx")
|
555
|
+
# => <Window: xxx (00070388)>
|
556
|
+
# irb(main):045:0> win2.title = "lib"
|
557
|
+
# => "lib"
|
558
|
+
# irb(main):046:0> win2
|
559
|
+
# AutoItX3::Au3Error: Unable to find a window with title 'xxx' and text ''!
|
560
|
+
# from C:/Users/marvin_g/Desktop/Automations/au3/trunk/lib/AutoItX3/window
|
561
|
+
# .rb:265:in `handle'
|
562
|
+
# from C:/Users/marvin_g/Desktop/Automations/au3/trunk/lib/AutoItX3/window
|
563
|
+
# .rb:154:in `inspect'
|
564
|
+
# irb(main):047:0> win
|
565
|
+
# => <Window: lib (00070388)>
|
566
|
+
# irb(main):048:0>
|
334
567
|
def title=(val)
|
335
568
|
Window.functions[__method__] ||= AU3_Function.new("WinSetTitle", 'SSS', 'L')
|
336
569
|
Window.functions[__method__].call(@title.wide, @text.wide, val.wide)
|
@@ -341,8 +574,17 @@ module AutoItX3
|
|
341
574
|
# AutoItX3::Window#trans = val ==> val
|
342
575
|
# AutoItX3::Window#transparency = val ==> val
|
343
576
|
#
|
344
|
-
#Sets
|
345
|
-
|
577
|
+
#Sets a window's transparency.
|
578
|
+
#===Parameters
|
579
|
+
#[+val+] The opacity you want the window set to; a numeric value between 0 (compelety transparent) and 255 (opaque).
|
580
|
+
#===Return value
|
581
|
+
#The argument passed.
|
582
|
+
#===Raises
|
583
|
+
#[NotImplementedError] You are using Windows Millenium or older which don't support transparent windows.
|
584
|
+
#===Example
|
585
|
+
# win.trans = 100
|
586
|
+
#===Remarks
|
587
|
+
#Note that a window whose transparency is set to 0 doesn't cause #visible? to return false.
|
346
588
|
def trans=(val)
|
347
589
|
Window.functions[__method__] ||= AU3_Function.new("WinSetTrans", 'SSL', 'L')
|
348
590
|
if Window.functions[__method__].call(@title.wide, @text.wide, val) == 0
|
@@ -352,31 +594,66 @@ module AutoItX3
|
|
352
594
|
end
|
353
595
|
alias transparency= trans=
|
354
596
|
|
355
|
-
#Waits for +self+ to exist.
|
356
|
-
|
597
|
+
#Waits for +self+ to exist.
|
598
|
+
#===Parameters
|
599
|
+
#[+timeout+] (+0+) The time to wait for the window to appear, in seconds. If set to 0 (which is the default), waits infinitely.
|
600
|
+
#===Return value
|
601
|
+
#true if the window was found, false if +timeout+ was reached.
|
602
|
+
#===Example
|
603
|
+
# win.wait
|
604
|
+
# #Only for 10 seconds
|
605
|
+
# puts "Window doesn't exist" unless win.wait(10)
|
357
606
|
def wait(timeout = 0)
|
358
607
|
Window.wait(@title, @text, timeout)
|
359
608
|
end
|
360
609
|
|
361
610
|
#Waits for +self+ to be the active (that is, get the input focus).
|
611
|
+
#===Parameters
|
612
|
+
#[+timeout+] (+0+) The time to wait, in seconds. 0 means waiting infinitely.
|
613
|
+
#===Return value
|
614
|
+
#true if the window has been activated, false if +timeout+ was reached.
|
615
|
+
#===Example
|
616
|
+
# win.wait_active
|
617
|
+
# #Only for 10 seconds
|
618
|
+
# puts "YOU HAVE TO CLICK THE WINDOW!!!!!" unless win.wait_active(10)
|
362
619
|
def wait_active(timeout = 0)
|
363
620
|
Window.functions[__method__] ||= AU3_Function.new("WinWaitActive", 'SSL', 'L')
|
364
621
|
Window.functions[__method__].call(@title.wide, @text.wide, timeout) != 0
|
365
622
|
end
|
366
623
|
|
367
624
|
#Waits for +self+ to be closed.
|
625
|
+
#===Parameters
|
626
|
+
#[+timeout+] (+0+) The time to wait, in seconds. 0 means to wait till doomsday.
|
627
|
+
#===Return value
|
628
|
+
#true if the window was closed, false if +timeout+ was reached.
|
629
|
+
#===Example
|
630
|
+
# win.wait_close(10) #Wait for 10 seconds
|
368
631
|
def wait_close(timeout = 0)
|
369
632
|
Window.functions[__method__] ||= AU3_Function.new("WinWaitClose", 'SSL', 'L')
|
370
633
|
Window.functions[__method__].call(@title.wide, @text.wide, timeout) != 0
|
371
634
|
end
|
372
635
|
|
373
636
|
#Waits for +self+ to lose the input focus.
|
637
|
+
#===Parameters
|
638
|
+
#[+timeout+] (+0+) The time to wait, in seconds. 0 means waiting infinitely.
|
639
|
+
#===Return value
|
640
|
+
#true if the window has lost the input focus, false if +timeout+ was reached.
|
641
|
+
#===Example
|
642
|
+
# win.wait_not_active(10) #Wait for 10 seconds
|
374
643
|
def wait_not_active(timeout = 0)
|
375
644
|
Window.functions[__method__] ||= AU3_Function.new("WinWaitNotActive", 'SSL', 'L')
|
376
645
|
Window.functions[__method__].call(@title.wide, @text.wide, timeout) != 0
|
377
646
|
end
|
378
647
|
|
379
|
-
#
|
648
|
+
#Gets the actually focused control in +self+.
|
649
|
+
#===Return value
|
650
|
+
#A AutoItX3::Control object.
|
651
|
+
#===Example
|
652
|
+
# #For any control
|
653
|
+
# c = win.focused_control
|
654
|
+
# #If you're sure it's a textbox
|
655
|
+
# t = AutoItX3::Edit.from_control(win.focused_control)
|
656
|
+
#===Remarks
|
380
657
|
#Note that if the owning window doesn't have the input focus, you'll get an
|
381
658
|
#unusable Control object back.
|
382
659
|
def focused_control
|
@@ -387,9 +664,17 @@ module AutoItX3
|
|
387
664
|
AutoItX3::Control.new(@title, @text, buffer.normal.strip)
|
388
665
|
end
|
389
666
|
|
390
|
-
#Reads the
|
391
|
-
|
392
|
-
#
|
667
|
+
#Reads the statusbar's text(s).
|
668
|
+
#===Parameters
|
669
|
+
#[+part+] (+1+) The part of the statusbar to read, a 1-based index.
|
670
|
+
#===Return value
|
671
|
+
#The text read.
|
672
|
+
#===Raises
|
673
|
+
#[Au3Error] Couldn't read the statusbar's text. The window may doesn't have a statusbar, it's not a mscommon statusbar or you tried to read an index out of range.
|
674
|
+
#===Example
|
675
|
+
# p win.statusbar_text #=> "Loading..."
|
676
|
+
#===Remarks
|
677
|
+
#I couldn't get this method to work with whatever window I tried. Suggestions?
|
393
678
|
def statusbar_text(part = 1)
|
394
679
|
Window.functions[__method__] ||= AU3_Function.new("StatusbarGetText", 'SSLPI')
|
395
680
|
buffer = " " * AutoItX3::BUFFER_SIZE
|