win 0.1.0 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -55,7 +55,7 @@ module Win
55
55
  handles = []
56
56
 
57
57
  # Insert callback proc into appropriate place of args Array
58
- args[api.prototype.find_index(:enum_callback), 0] =
58
+ args[api.prototype.find_index(:EnumWindowsProc), 0] =
59
59
  proc do |handle, message|
60
60
  handles << handle
61
61
  block ? block[handle, message] : true
@@ -90,41 +90,74 @@ module Win
90
90
  # Windows GUI API definitions:
91
91
 
92
92
  ##
93
- # Tests whether the specified window handle identifies an existing window.
94
- # A thread should not use IsWindow for a window that it did not create because the window
95
- # could be destroyed after this function was called. Further, because window handles are
96
- # recycled the handle could even point to a different window.
93
+ # The IsWindow function determines whether the specified window handle identifies an existing window.
94
+ # [*Syntax*] BOOL IsWindow( HWND hWnd );
95
+ #
96
+ # hWnd:: [in] Handle to the window to test.
97
+ #
98
+ # *Returns*:: If the window handle identifies an existing window, the return value is (*true*).
99
+ # If the window handle does not identify an existing window, the return value is (*false*).
100
+ # ---
101
+ # *remarks*:
102
+ # A thread should not use IsWindow for a window that it did not create because the window
103
+ # could be destroyed after this function was called. Further, because window handles are
104
+ # recycled the handle could even point to a different window.
97
105
  #
98
106
  # :call-seq:
99
107
  # window?( win_handle )
100
108
  #
101
- function 'IsWindow', 'L', 'L'
109
+ function :IsWindow, [:ulong], :int, boolean: true
102
110
 
103
111
  ##
104
- # Tests if the specified window, its parent window, its parent's parent window, and so forth,
105
- # have the WS_VISIBLE style. Because the return value specifies whether the window has the
106
- # WS_VISIBLE style, it may be true even if the window is totally obscured by other windows.
112
+ # The IsWindowVisible function retrieves the visibility state of the specified window.
113
+ # [*Syntax*] BOOL IsWindowVisible( HWND hWnd );
114
+ #
115
+ # hWnd:: [in] Handle to the window to test.
116
+ #
117
+ # *Returns*:: If the specified window, its parent window, its parent's parent window, and so forth,
118
+ # have the WS_VISIBLE style set, return value is *true*. Because the return value specifies
119
+ # whether the window has the WS_VISIBLE style, it may be true even if the window is totally
120
+ # obscured by other windows.
121
+ # ---
122
+ # *Remarks*:
123
+ # - The visibility state of a window is indicated by the WS_VISIBLE style bit. When WS_VISIBLE is set,
124
+ # the window is displayed and subsequent drawing into it is displayed as long as the window has the
125
+ # WS_VISIBLE style.
126
+ # - Any drawing to a window with the WS_VISIBLE style will not be displayed if the window is obscured
127
+ # by other windows or is clipped by its parent window.
107
128
  #
108
129
  # :call-seq:
109
130
  # [window_]visible?( win_handle )
110
131
  #
111
- function 'IsWindowVisible', 'L', 'L', aliases: :visible?
132
+ function :IsWindowVisible, [:ulong], :int, boolean: true, aliases: :visible?
112
133
 
113
134
  ##
114
135
  # Tests whether the specified window is maximized.
136
+ # [*Syntax*] BOOL IsZoomed( HWND hWnd );
137
+ #
138
+ # hWnd:: [in] Handle to the window to test.
139
+ #
140
+ # *Returns*:: If the window is zoomed (maximized), the return value is *true*.
141
+ # If the window is not zoomed (maximized), the return value is *false*.
115
142
  #
116
143
  # :call-seq:
117
144
  # zoomed?( win_handle ), maximized?( win_handle )
118
145
  #
119
- function 'IsZoomed', 'L', 'L', aliases: :maximized?
146
+ function :IsZoomed, [:ulong], :int, boolean: true, aliases: :maximized?
120
147
 
121
148
  ##
122
- # Tests whether the specified window is maximized.
149
+ # Tests whether the specified window is minimized.
150
+ # [*Syntax*] BOOL IsIconic( HWND hWnd );
151
+ #
152
+ # hWnd:: [in] Handle to the window to test.
153
+ #
154
+ # *Returns*:: If the window is iconic (minimized), the return value is *true*.
155
+ # If the window is not iconic (minimized), the return value is *false*.
123
156
  #
124
157
  # :call-seq:
125
158
  # iconic?( win_handle ), minimized?( win_handle )
126
159
  #
127
- function 'IsIconic', 'L', 'L', aliases: :minimized?
160
+ function :IsIconic, [:ulong], :int, boolean: true, aliases: :minimized?
128
161
 
129
162
  ##
130
163
  # Tests whether a window is a child (or descendant) window of a specified parent window.
@@ -132,174 +165,233 @@ module Win
132
165
  # is in the chain of parent windows; the chain of parent windows leads from the original overlapped
133
166
  # or pop-up window to the child window.
134
167
  #
168
+ # [*Syntax*] BOOL IsChild( HWND hWndParent, HWND hWnd);
169
+ #
170
+ # hWndParent:: [in] Handle to the parent window.
171
+ # hWnd:: [in] Handle to the window to be tested.
172
+ #
173
+ # *Returns*:: If the window is a child or descendant window of the specified parent window,
174
+ # the return value is *true*. If the window is not a child or descendant window of
175
+ # the specified parent window, the return value is *false*.
135
176
  # :call-seq:
136
177
  # child?( win_handle )
137
178
  #
138
- function 'IsChild', 'LL', 'L'
179
+ function :IsChild, [:ulong, :ulong], :int, boolean: true
139
180
 
140
181
  ##
141
- # Returns a handle to the top-level window whose class and window name match the specified strings.
142
- # This function does not search child windows. This function does not perform a case-sensitive search.
143
- #
144
- # Parameters:
145
- # class_name (P) - String that specifies (window) class name OR class atom created by a previous
146
- # call to the RegisterClass(Ex) function. The atom must be in the low-order word of class_name;
147
- # the high-order word must be zero. The class name can be any name registered with RegisterClass(Ex),
148
- # or any of the predefined control-class names. If this parameter is nil, it finds any window whose
149
- # title matches the win_title parameter.
150
- # win_name (P) - String that specifies the window name (title). If nil, all names match.
151
- # Return Value (L): found window handle or NIL if nothing found
182
+ # The FindWindow function retrieves a handle to the top-level window whose class name and window name
183
+ # match the specified strings. This function does not search child windows. This function does not
184
+ # perform a case-sensitive search.
185
+ #
186
+ # To search child windows, beginning with a specified child window, use the FindWindowEx function.
187
+ #
188
+ # [*Syntax*] HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName );
189
+ #
190
+ # lpClassName:: [in] Pointer to a null-terminated string that specifies the class name or a class
191
+ # atom created by a previous call to the RegisterClass or RegisterClassEx function.
192
+ # The atom must be in the low-order word of lpClassName; the high-order word must be zero.
193
+ # If lpClassName points to a string, it specifies the window class name. The class name
194
+ # can be any name registered with RegisterClass or RegisterClassEx, or any of the
195
+ # predefined control-class names.
196
+ # If lpClassName is NULL, it finds any window whose title matches the lpWindowName parameter.
197
+ # lpWindowName:: [in] Pointer to a null-terminated string that specifies the window name (the window's title).
198
+ # If this parameter is NULL, all window names match.
199
+ # *Returns*:: If the function succeeds, the return value is a handle to the window that has the specified
200
+ # class name and window name. If the function fails, the return value is *nil*.
201
+ # To get extended error information, call GetLastError.
202
+ # ---
203
+ # *Remarks*:
204
+ # - If the lpWindowName parameter is not NULL, FindWindow calls the GetWindowText function to retrieve
205
+ # the window name for comparison. For a description of a potential problem that can arise, see the
206
+ # Remarks for GetWindowText.
207
+ # - To check if the Microsoft IntelliType version 1.x software is running, call FindWindow as follows:
208
+ # find_window("MSITPro::EventQueue", nil)
209
+ # - To check if the IntelliType version 2.0 software is running, call FindWindow as follows:
210
+ # find_window("Type32_Main_Window", nil)
211
+ # If the IntelliType software is running, it sends WM_APPCOMMAND messages to the application.
212
+ # Otherwise the application must install a hook to receive WM_APPCOMMAND messages.
152
213
  #
153
214
  # :call-seq:
154
215
  # win_handle = find_window( class_name, win_name )
155
216
  #
156
- function 'FindWindow', 'PP', 'L', zeronil: true
217
+ function :FindWindow, [:pointer, :pointer], :ulong, zeronil: true
157
218
 
158
219
  ##
159
- # Unicode version of find_window (strings must be encoded as utf-16LE AND terminate with "\x00\x00")
220
+ # Unicode version of FindWindow (strings must be encoded as utf-16LE AND terminate with "\x00\x00")
160
221
  #
161
222
  # :call-seq:
162
223
  # win_handle = find_window_w( class_name, win_name )
163
224
  #
164
- function 'FindWindowW', 'PP', 'L', zeronil: true
225
+ function :FindWindowW, [:pointer, :pointer], :ulong, zeronil: true
165
226
 
166
227
  ##
167
- # Retrieves a handle to a CHILD window whose class name and window name match the specified strings.
168
- # The function searches child windows, beginning with the one following the specified child window.
169
- # This function does NOT perform a case-sensitive search.
170
- #
171
- # Parameters:
172
- # parent (L) - Handle to the parent window whose child windows are to be searched.
173
- # If nil, the function uses the desktop window as the parent window.
174
- # The function searches among windows that are child windows of the desktop.
175
- # after_child (L) - Handle to a child window. Search begins with the NEXT child window in the Z order.
176
- # The child window must be a direct child window of parent, not just a descendant window.
177
- # If after_child is nil, the search begins with the first child window of parent.
178
- # win_class (P), win_title (P) - Strings that specify window class and name(title). If nil, anything matches.
179
- # Returns (L): found child window handle or NIL if nothing found
228
+ # The FindWindowEx function retrieves a handle to a window whose class name and window name match the specified
229
+ # strings. The function searches child windows, beginning with the one following the specified child window.
230
+ # This function does not perform a case-sensitive search.
231
+ #
232
+ # [*Syntax*] HWND FindWindowEx( HWND hwndParent, HWND hwndChildAfter, LPCTSTR lpszClass, LPCTSTR lpszWindow );
233
+ #
234
+ # hwndParent:: [in] Handle to the parent window whose child windows are to be searched.
235
+ # If hwndParent is NULL, the function uses the desktop window as the parent window.
236
+ # The function searches among windows that are child windows of the desktop.
237
+ # Microsoft Windows 2000 and Windows XP: If hwndParent is HWND_MESSAGE, the function
238
+ # searches all message-only windows.
239
+ # hwndChildAfter:: [in] Handle to a child window. The search begins with the next child window in the Z order.
240
+ # The child window must be a direct child window of hwndParent, not just a descendant window.
241
+ # If hwndChildAfter is NULL, the search begins with the first child window of hwndParent.
242
+ # Note that if both hwndParent and hwndChildAfter are NULL, the function searches all
243
+ # top-level and message-only windows.
244
+ # lpszClass:: [in] Pointer to a null-terminated string that specifies the class name or a class atom created
245
+ # by a previous call to the RegisterClass or RegisterClassEx function. The atom must be placed in
246
+ # the low-order word of lpszClass; the high-order word must be zero.
247
+ # If lpszClass is a string, it specifies the window class name. The class name can be any name
248
+ # registered with RegisterClass or RegisterClassEx, or any of the predefined control-class names,
249
+ # or it can be MAKEINTATOM(0x800). In this latter case, 0x8000 is the atom for a menu class. For
250
+ # more information, see the Remarks section of this topic.
251
+ # lpszWindow:: [in] Pointer to a null-terminated string that specifies the window name (the window's title).
252
+ # If this parameter is NULL, all window names match.
253
+ #
254
+ # *Returns*:: If the function succeeds, the return value is a handle to the window that has the specified
255
+ # class and window names. If the function fails, the return value is NULL. For extended error info,
256
+ # call GetLastError.
257
+ # ---
258
+ # *Remarks*:
259
+ # - If the lpszWindow parameter is not NULL, FindWindowEx calls the GetWindowText function to retrieve the window name for comparison. For a description of a potential problem that can arise, see the Remarks section of GetWindowText.
260
+ # - An application can call this function in the following way.
261
+ # find_window_ex( nil, nil, MAKEINTATOM(0x8000), nil )
262
+ # 0x8000 is the atom for a menu class. When an application calls this function, the function checks whether
263
+ # a context menu is being displayed that the application created.
180
264
  #
181
265
  # :call-seq:
182
266
  # win_handle = find_window_ex( win_handle, after_child, class_name, win_name )
183
267
  #
184
- function 'FindWindowEx', 'LLPP', 'L', zeronil: true
268
+ function :FindWindowEx, [:ulong, :ulong, :pointer, :pointer], :ulong, zeronil: true
185
269
 
186
270
  ##
187
- # Returns the text of the specified window's title bar (if it has one).
188
- # If the specified window is a control, the text of the control is copied. However, GetWindowText
189
- # cannot retrieve the text of a control in another application.
190
- #
191
- # Original Parameters:
192
- # win_handle (L) - Handle to the window and, indirectly, the class to which the window belongs.
193
- # text (P) - Long Pointer to the buffer that is to receive the text string.
194
- # max_count (I) - Specifies the length, in TCHAR, of the buffer pointed to by the text parameter.
195
- # The class name string is truncated if it is longer than the buffer and is always null-terminated.
196
- # Original Return Value (L): Length, in characters, of the copied string, not including the terminating null
197
- # character, indicates success. Zero indicates that the window has no title bar or text, if the title bar
198
- # is empty, or if the window or control handle is invalid. For extended error information, call GetLastError.
199
- #
271
+ # GetWindowText returns the text of the specified window's title bar (if it has one).
272
+ # If the specified window is a control, the text of the control is copied. However, GetWindowText
273
+ # cannot retrieve the text of a control in another application.
274
+ #
275
+ # [*Syntax*] int GetWindowText( HWND hWnd, LPTSTR lpString, int nMaxCount );
276
+ #
277
+ # *Original* Parameters:
278
+ # hWnd:: Handle to the window and, indirectly, the class to which the window belongs.
279
+ # lpString:: Long Pointer to the buffer that is to receive the text string.
280
+ # nMaxCount:: Specifies the length, in TCHAR, of the buffer pointed to by the text parameter.
281
+ # The class name string is truncated if it is longer than the buffer and is always null-terminated.
282
+ # *Original* Return:: Length, in characters, of the copied string, not including the terminating null
283
+ # character (if success). Zero indicates that the window has no title bar or text,
284
+ # if the title bar is empty, or if the window or control handle is invalid.
285
+ # For extended error information, call GetLastError.
286
+ # ---
200
287
  # Enhanced API requires only win_handle and returns rstripped text
201
288
  #
202
- # Enhanced Parameters:
203
- # win_handle (L) - Handle to the window and, indirectly, the class to which the window belongs.
204
- # Returns: Window title bar text or nil
205
- # If the window has no title bar or text, if the title bar is empty, or if the window or control handle
206
- # is invalid, the return value is NIL. To get extended error information, call GetLastError.
207
- #
208
- # Remarks: This function CANNOT retrieve the text of an edit control in ANOTHER app.
209
- # If the target window is owned by the current process, GetWindowText causes a WM_GETTEXT message to
289
+ # *Enhanced* Parameters:
290
+ # win_handle:: Handle to the window and, indirectly, the class to which the window belongs.
291
+ # *Returns*:: Window title bar text or nil. If the window has no title bar or text, if the title bar
292
+ # is empty, or if the window or control handle is invalid, the return value is *NIL*.
293
+ # To get extended error information, call GetLastError.
294
+ # ---
295
+ # *Remarks*: This function CANNOT retrieve the text of an edit control in ANOTHER app.
296
+ # - If the target window is owned by the current process, GetWindowText causes a WM_GETTEXT message to
210
297
  # be sent to the specified window or control. If the target window is owned by another process and has
211
298
  # a caption, GetWindowText retrieves the window caption text. If the window does not have a caption,
212
299
  # the return value is a null string. This allows to call GetWindowText without becoming unresponsive
213
300
  # if the target window owner process is not responding. However, if the unresponsive target window
214
301
  # belongs to the calling app, GetWindowText will cause the calling app to become unresponsive.
215
- # To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead
302
+ # - To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead
216
303
  # of calling GetWindowText.
217
304
  #
218
305
  #:call-seq:
219
306
  # text = [get_]window_text( win_handle )
220
307
  #
221
- function 'GetWindowText', 'LPI', 'L', &return_string
308
+ function :GetWindowText, [:ulong, :pointer, :int], :int, &return_string
222
309
 
223
310
  ##
224
- # Unicode version of get_window_text (returns rstripped utf-8 string)
311
+ # GetWindowTextW is a Unicode version of GetWindowText (returns rstripped utf-8 string)
225
312
  # API improved to require only win_handle and return rstripped string
226
313
  #
227
314
  #:call-seq:
228
315
  # text = [get_]window_text_w( win_handle )
229
316
  #
230
- function 'GetWindowTextW', 'LPI', 'L', &return_string('utf-8')
317
+ function :GetWindowTextW, [:ulong, :pointer, :int], :int, &return_string('utf-8')
231
318
 
232
319
  ##
233
- # Retrieves the name of the class to which the specified window belongs.
234
- #
235
- # Original Parameters:
236
- # win_handle (L) - Handle to the window and, indirectly, the class to which the window belongs.
237
- # class_name (P) - Long Pointer to the buffer that is to receive the class name string.
238
- # max_count (I) - Specifies the length, in TCHAR, of the buffer pointed to by the class_name parameter.
239
- # The class name string is truncated if it is longer than the buffer and is always null-terminated.
240
- # Original Return Value (L): Length, in characters, of the copied string, not including the terminating null
241
- # character, indicates success. Zero indicates that the window has no title bar or text, if the title bar
242
- # is empty, or if the window or control handle is invalid. For extended error information, call GetLastError.
243
- #
320
+ # GetClassName retrieves the name of the class to which the specified window belongs.
321
+ # [*Syntax*] int GetClassName( HWND hWnd, LPTSTR lpClassName, int nMaxCount );
322
+ # *Original* Parameters:
323
+ # hWnd:: [in] Handle to the window and, indirectly, the class to which the window belongs.
324
+ # lpClassName:: [out] Pointer to the buffer that is to receive the class name string.
325
+ # nMaxCount:: [in] Specifies the length, in TCHAR, of the buffer pointed to by the lpClassName parameter.
326
+ # The class name string is truncated if it is longer than the buffer and is always null-terminated.
327
+ # *Original* Return:: Length, in characters, of the copied string, not including the terminating null character,
328
+ # indicates success. Zero indicates that the window has no title bar or text, if the title
329
+ # bar is empty, or if the window or control handle is invalid.
330
+ # ---
244
331
  # API improved to require only win_handle and return rstripped string
245
332
  #
246
- # Enhanced Parameters:
247
- # win_handle (L) - Handle to the window and, indirectly, the class to which the window belongs.
248
- # Returns: Name of the class or NIL if function fails. For extended error information, call GetLastError.
333
+ # *Enhanced* Parameters:
334
+ # win_handle:: Handle to the window and, indirectly, the class to which the window belongs.
335
+ # *Returns*:: Name of the class or *nil* if function fails. For extended error information, call GetLastError.
249
336
  #
250
337
  #:call-seq:
251
338
  # text = [get_]class_name( win_handle )
252
339
  #
253
- function 'GetClassName', 'LPI', 'I', &return_string
340
+ function :GetClassName, [:ulong, :pointer, :int], :int, &return_string
254
341
 
255
342
  ##
256
- # Unicode version of get_class_name (returns rstripped utf-8 string)
343
+ # GetClassNameW is a Unicode version of GetClassName (returns rstripped utf-8 string)
257
344
  # API improved to require only win_handle and return rstripped string
258
345
  #
259
346
  #:call-seq:
260
347
  # text = [get_]class_name_w( win_handle )
261
348
  #
262
- function 'GetClassNameW', 'LPI', 'I', &return_string('utf-8')
349
+ function :GetClassNameW, [:ulong, :pointer, :int], :int, &return_string('utf-8')
263
350
 
264
351
  ##
265
- # Shows and hides windows.
352
+ # ShowWindow shows and hides windows (sets the specified window's show state).
353
+ #
354
+ # [*Syntax*] BOOL ShowWindow( HWND hWnd, int nCmdShow);
266
355
  #
267
- # Parameters:
268
- # win_handle (L) - Handle to the window.
269
- # cmd (I) - Specifies how the window is to be shown. This parameter is ignored the first time an
270
- # application calls ShowWindow, if the program that launched the application provides a STARTUPINFO
271
- # structure. Otherwise, the first time ShowWindow is called, the value should be the value obtained
272
- # by the WinMain function in its nCmdShow parameter. In subsequent calls, cmd may be:
273
- # SW_HIDE, SW_MAXIMIZE, SW_MINIMIZE, SW_SHOW, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED, SW_SHOWMINNOACTIVE,
274
- # SW_SHOWNA, SW_SHOWNOACTIVATE, SW_SHOWNORMAL, SW_RESTORE, SW_SHOWDEFAULT, SW_FORCEMINIMIZE
356
+ # hWnd:: Handle to the window.
357
+ # nCmdShow:: Specifies how the window is to be shown. This parameter is ignored the first time an
358
+ # application calls ShowWindow, if the program that launched the application provides a
359
+ # STARTUPINFO structure. Otherwise, the first time ShowWindow is called, the value should
360
+ # be the value obtained by the WinMain function in its nCmdShow parameter. In subsequent
361
+ # calls, cmd may be:
362
+ # SW_HIDE, SW_MAXIMIZE, SW_MINIMIZE, SW_SHOW, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED, SW_SHOWMINNOACTIVE,
363
+ # SW_SHOWNA, SW_SHOWNOACTIVATE, SW_SHOWNORMAL, SW_RESTORE, SW_SHOWDEFAULT, SW_FORCEMINIMIZE
275
364
  #
276
- # Original Return Value: - Nonzero if the window was PREVIOUSLY visible, otherwise zero
277
- # Enhanced Returns: - True if the window was PREVIOUSLY visible, otherwise false
365
+ # *Returns*:: *True* if the window was PREVIOUSLY visible, otherwise *false*
278
366
  #
279
367
  #:call-seq:
280
368
  # was_visible = show_window( win_handle, cmd )
281
369
  #
282
- function 'ShowWindow', 'LI', 'I', boolean: true
370
+ function :ShowWindow, [:ulong, :int], :int, boolean: true
283
371
 
284
372
  ##
285
- # Retrieves the identifier of the thread that created the specified window
286
- # and, optionally, the identifier of the process that created the window.
287
- #
288
- # Original Parameters:
289
- # handle (L) - Handle to the window.
290
- # process (P) - A POINTER to a (Long) variable that receives the process identifier.
291
- # Original Return (L): Identifier of the thread that created the window.
292
- #
373
+ # GetWindowThreadProcessId retrieves the identifier of the thread that created the specified window
374
+ # and, optionally, the identifier of the process that created the window.
375
+ #
376
+ # [*Syntax*] DWORD GetWindowThreadProcessId( HWND hWnd, LPDWORD lpdwProcessId );
377
+ #
378
+ # *Original* Parameters:
379
+ # hWnd:: [in] Handle to the window.
380
+ # lpdwProcessId:: [out] Pointer to a variable that receives the process identifier. If this parameter
381
+ # is not NULL, GetWindowThreadProcessId copies the identifier of the process to the
382
+ # variable; otherwise, it does not.
383
+ # *Original* Return:: The identifier of the thread that created the window.
384
+ # ---
293
385
  # API improved to accept window handle as a single arg and return a pair of [thread, process] ids
294
386
  #
295
- # New Parameters:
296
- # handle (L) - Handle to the window.
297
- # Returns: Pair of identifiers of the thread and process_id that created the window.
387
+ # *New* Parameters:
388
+ # handle:: Handle to the window.
389
+ # *Returns*: Pair of identifiers of the thread and process_id that created the window.
298
390
  #
299
391
  #:call-seq:
300
392
  # thread, process_id = [get_]window_tread_process_id( win_handle )
301
393
  #
302
- function 'GetWindowThreadProcessId', [:long, :pointer], :long,
394
+ function :GetWindowThreadProcessId, [:ulong, :pointer], :long,
303
395
  &->(api, *args) {
304
396
  namespace.enforce_count( args, api.prototype, -1)
305
397
  process = FFI::MemoryPointer.new(:long)
@@ -310,178 +402,190 @@ module Win
310
402
  # goes crazy if block is attached to meta-definition
311
403
 
312
404
  ##
313
- # Retrieves the dimensions of the specified window bounding rectangle.
314
- # Dimensions are given relative to the upper-left corner of the screen.
405
+ # GetWindowRect retrieves the dimensions of the specified window bounding rectangle.
406
+ # Dimensions are given relative to the upper-left corner of the screen.
315
407
  #
316
- # Original Parameters:
317
- # win_handle (L) - Handle to the window.
318
- # rect (P) - Long pointer to a RECT structure that receives the screen coordinates of the upper-left and
319
- # lower-right corners of the window.
320
- # Original Return Value: Nonzero indicates success. Zero indicates failure. For error info, call GetLastError.
408
+ # [*Syntax*] BOOL GetWindowRect( HWND hWnd, LPRECT lpRect );
321
409
  #
410
+ # *Original* Parameters:
411
+ # hWnd:: [in] Handle to the window.
412
+ # lpRect:: [out] Pointer to a structure that receives the screen coordinates of the upper-left and
413
+ # lower-right corners of the window.
414
+ # *Original* Return:: Nonzero indicates success. Zero indicates failure. For error info, call GetLastError.
415
+ # ---
322
416
  # API improved to accept only window handle and return 4-member dimensions array (left, top, right, bottom)
323
417
  #
324
- # New Parameters:
325
- # win_handle (L) - Handle to the window
326
- # New Return: Array(left, top, right, bottom) - rectangle dimensions
327
- #
328
- # Remarks: As a convention for the RECT structure, the bottom-right coordinates of the returned rectangle
329
- # are exclusive. In other words, the pixel at (right, bottom) lies immediately outside the rectangle.
418
+ # *New* Parameters:
419
+ # win_handle:: Handle to the window
420
+ # *Returns*:: Array(left, top, right, bottom) - rectangle dimensions
421
+ # ---
422
+ # *Remarks*: As a convention for the RECT structure, the bottom-right coordinates of the returned rectangle
423
+ # are exclusive. In other words, the pixel at (right, bottom) lies immediately outside the rectangle.
330
424
  #
331
425
  #:call-seq:
332
426
  # rect = [get_]window_rect( win_handle )
333
427
  #
334
- function 'GetWindowRect', 'LP', 'I',
428
+ function :GetWindowRect, [:ulong, :pointer], :int,
335
429
  &->(api, *args) {
336
430
  namespace.enforce_count( args, api.prototype, -1)
337
431
  rect = FFI::MemoryPointer.new(:long, 4)
338
432
  rect.write_array_of_long([0, 0, 0, 0])
339
433
  res = api.call args.first, rect
340
- res == 0 ? [nil, nil, nil, nil] : rect.read_array_of_long(4) }
434
+ res == 0 ? [nil, nil, nil, nil] : rect.read_array_of_long(4) }
341
435
  # weird lambda literal instead of normal block is needed because current version of RDoc
342
436
  # goes crazy if block is attached to meta-definition
343
437
 
344
- # This is an application-defined callback function that receives top-level window handles as a result of a call
345
- # to the EnumWindows, EnumChildWindows or EnumDesktopWindows function.
438
+ ##
439
+ # EnumWindowsProc is an application-defined callback function that receives top-level window handles
440
+ # as a result of a call to the EnumWindows, EnumChildWindows or EnumDesktopWindows function.
346
441
  #
347
- # Syntax: BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam );
442
+ # [*Syntax*] BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam );
348
443
  #
349
- # Parameters:
350
- # hwnd (L) - [out] Handle to a top-level window.
351
- # lParam (L) - [in] Specifies the application-defined value given in EnumWindows or EnumDesktopWindows.
352
- # Return Values:
353
- # TRUE continues enumeration. FALSE stops enumeration.
444
+ # hWnd:: [in] Handle to a top-level window.
445
+ # lParam:: [in] Specifies the application-defined value given in EnumWindows or EnumDesktopWindows.
446
+ # *Return* *Value*:: To continue enumeration, the callback function must return TRUE;
447
+ # to stop enumeration, it must return FALSE.
448
+ # ---
449
+ # Remarks:
450
+ # - An application must register this callback function by passing its address to EnumWindows,
451
+ # EnumChildWindows or EnumDesktopWindows.
452
+ # - You must ensure that the callback function sets SetLastError if it fails.
453
+ #
454
+ # :call-seq:
455
+ # EnumWindowsProc callback block: {|win_handle, value| your callback code }
354
456
  #
355
- # Remarks: An application must register this callback function by passing its address to EnumWindows,
356
- # EnumChildWindows or EnumDesktopWindows.
357
- callback :enum_callback, 'LL', :bool
457
+ callback :EnumWindowsProc, [:ulong, :long], :bool
358
458
 
359
459
  ##
360
460
  # The EnumWindows function enumerates all top-level windows on the screen by passing the handle to
361
461
  # each window, in turn, to an application-defined callback function. EnumWindows continues until
362
462
  # the last top-level window is enumerated or the callback function returns FALSE.
363
463
  #
364
- # Original Parameters:
365
- # callback [K] - Pointer to an application-defined callback function (see EnumWindowsProc).
366
- # value [P] - Specifies an application-defined value(message) to be passed to the callback function.
367
- # Original Return: Nonzero if the function succeeds, zero if the function fails. GetLastError for error info.
368
- # If callback returns zero, the return value is also zero. In this case, the callback function should
369
- # call SetLastError to obtain a meaningful error code to be returned to the caller of EnumWindows.
370
- #
371
- # API improved to accept blocks (instead of callback objects) and message as a single arg
372
- #
373
- # New Parameters:
374
- # message [P] - Specifies an application-defined value(message) to be passed to the callback function.
375
- # block given to method invocation serves as an application-defined callback function (see EnumWindowsProc).
376
- # Returns: True if the function succeeds, false if the function fails. GetLastError for error info.
377
- # If callback returns zero, the return value is also zero. In this case, the callback function should
378
- # call SetLastError to obtain a meaningful error code to be returned to the caller of EnumWindows.
379
- #
380
- # Remarks: The EnumWindows function does not enumerate child windows, with the exception of a few top-level
381
- # windows owned by the system that have the WS_CHILD style. This function is more reliable than calling
382
- # the GetWindow function in a loop. An application that calls GetWindow to perform this task risks being
383
- # caught in an infinite loop or referencing a handle to a window that has been destroyed.
464
+ # [*Syntax*] BOOL EnumWindows( WNDENUMPROC lpEnumFunc, LPARAM lParam );
465
+ #
466
+ # *Original* Parameters:
467
+ # lpEnumFunc:: [in] Pointer to an application-defined callback function of EnumWindowsProc type.
468
+ # lParam:: [in] Specifies an application-defined value(message) to be passed to the callback function.
469
+ # *Original* Return:: Nonzero if the function succeeds, zero if the function fails. GetLastError for error info.
470
+ # If callback returns zero, the return value is also zero. In this case, the callback
471
+ # function should call SetLastError to obtain a meaningful error code to be returned to
472
+ # the caller of EnumWindows.
473
+ # ---
474
+ # API improved to accept blocks (instead of callback objects) with message as an optional argument
475
+ #
476
+ # *New* Parameters:
477
+ # message:: Specifies an application-defined value(message) to be passed to the callback block.
478
+ # attached block:: Serves as an application-defined callback function (see EnumWindowsProc).
479
+ # *Returns*:: *True* if the function succeeds, *false* if the function fails. GetLastError for error info.
480
+ # If callback returned zero/false, the return value is also false. In this case, the callback
481
+ # function should call SetLastError to obtain a meaningful error code to be returned to the
482
+ # caller of EnumWindows.
483
+ # ---
484
+ # *Remarks*: The EnumWindows function does not enumerate child windows, with the exception of a few top-level
485
+ # windows owned by the system that have the WS_CHILD style. This function is more reliable than calling
486
+ # the GetWindow function in a loop. An application that calls GetWindow to perform this task risks being
487
+ # caught in an infinite loop or referencing a handle to a window that has been destroyed.
384
488
  #
385
489
  # :call-seq:
386
490
  # handles = enum_windows( [value=0] ) {|handle, value| your callback procedure }
387
491
  #
388
- function'EnumWindows', [:enum_callback, :long], :bool, &return_enum
492
+ function :EnumWindows, [:EnumWindowsProc, :long], :bool, &return_enum
389
493
 
390
494
  ##
391
- #EnumDesktopWindows Function
392
- #
393
- #Enumerates all top-level windows associated with the specified desktop. It passes the handle to each window, in turn, to an application-defined callback function.
394
- #
395
- #
396
- #Syntax
397
- #BOOL WINAPI EnumDesktopWindows(
398
- # __in_opt HDESK hDesktop,
399
- # __in WNDENUMPROC lpfn,
400
- # __in LPARAM lParam
401
- #);
402
- #
403
- #Parameters
404
- #hDesktop
405
- #A handle to the desktop whose top-level windows are to be enumerated. This handle is returned by the CreateDesktop, GetThreadDesktop, OpenDesktop, or OpenInputDesktop function, and must have the DESKTOP_ENUMERATE access right. For more information, see Desktop Security and Access Rights.
406
- #
407
- #If this parameter is NULL, the current desktop is used.
408
- #
409
- #lpfn
410
- #A pointer to an application-defined EnumWindowsProc callback function.
411
- #
412
- #lParam
413
- #An application-defined value to be passed to the callback function.
414
- #
415
- #Return Value
416
- #If the function fails or is unable to perform the enumeration, the return value is zero.
417
- #
418
- #To get extended error information, call GetLastError.
419
- #
420
- #You must ensure that the callback function sets SetLastError if it fails.
421
- #
422
- #Windows Server 2003 and Windows XP/2000: If there are no windows on the desktop, GetLastError returns ERROR_INVALID_HANDLE.
423
- #Remarks
424
- #The EnumDesktopWindows function repeatedly invokes the lpfn callback function until the last top-level window is enumerated or the callback function returns FALSE.
425
- #
426
- #Requirements
427
- #Client Requires Windows Vista, Windows XP, or Windows 2000 Professional.
495
+ # EnumDesktopWindows Function enumerates all top-level windows associated with the specified desktop.
496
+ # It passes the handle to each window, in turn, to an application-defined callback function.
497
+ #
498
+ # [*Syntax*] BOOL WINAPI EnumDesktopWindows( __in_opt HDESK hDesktop, __in WNDENUMPROC lpfn, __in LPARAM lParam);
499
+ #
500
+ # *Original* Parameters:
501
+ # hDesktop:: A handle to the desktop whose top-level windows are to be enumerated. This handle is returned by
502
+ # the CreateDesktop, GetThreadDesktop, OpenDesktop, or OpenInputDesktop function, and must have the
503
+ # DESKTOP_ENUMERATE access right. For more information, see Desktop Security and Access Rights.
504
+ # If this parameter is NULL, the current desktop is used.
505
+ # lpfn:: A pointer to an application-defined EnumWindowsProc callback.
506
+ # lParam:: An application-defined value to be passed to the callback.
507
+ # *Return*:: If the function fails or is unable to perform the enumeration, the return value is zero.
508
+ # To get extended error information, call GetLastError. You must ensure that the callback function
509
+ # sets SetLastError if it fails.
510
+ # ---
511
+ # API enhanced to return *true*/*false* instead of nonzero/zero, and message value is optional (defaults to 0).
512
+ #
513
+ # *Enhanced*12 34 Parameters:
514
+ # desktop:: A handle to the desktop whose top-level windows are to be enumerated.
515
+ # value:: Specifies an application-defined value(message) to be passed to the callback (default 0).
516
+ # attached block:: Serves as an application-defined callback function (see EnumWindowsProc).
517
+ # ---
518
+ # *Remarks*:
519
+ # - Windows Server 2003 and Windows XP/2000: If there are no windows on the desktop, GetLastError returns
520
+ # ERROR_INVALID_HANDLE.
521
+ # - The EnumDesktopWindows function repeatedly invokes the callback function until the last top-level window
522
+ # is enumerated or the callback function returns FALSE.
523
+ # ---
524
+ # *Requirements*:
525
+ # Client Requires Windows Vista, Windows XP, or Windows 2000 Professional.
428
526
  #
429
527
  # :call-seq:
430
528
  # handles = enum_desktop_windows( desktop_handle, [value=0] ) {|handle, value| your callback procedure }
431
529
  #
432
- function'EnumDesktopWindows', [:ulong, :enum_callback, :long], :bool, &return_enum
530
+ function :EnumDesktopWindows, [:ulong, :EnumWindowsProc, :long], :bool, &return_enum
433
531
 
434
532
  ##
435
- # Enumerates child windows to a given window.
533
+ # The EnumChildWindows function enumerates the child windows that belong to the specified parent window by
534
+ # passing the handle of each child window, in turn, to an application-defined callback. EnumChildWindows
535
+ # continues until the last child window is enumerated or the callback function returns FALSE.
536
+ #
537
+ # [*Syntax*] BOOL EnumChildWindows( HWND hWndParent, WNDENUMPROC lpEnumFunc, LPARAM lParam );
436
538
  #
437
- # Original Parameters:
438
- # parent (L) - Handle to the parent window whose child windows are to be enumerated.
439
- # callback [K] - Pointer to an application-defined callback function (see EnumWindowsProc).
440
- # message [P] - Specifies an application-defined value(message) to be passed to the callback function.
441
- # Original Return: Not used (?!)
442
- # If callback returns zero, the return value is also zero. In this case, the callback function should
443
- # call SetLastError to obtain a meaningful error code to be returned to the caller of EnumWindows.
444
- # If it is nil, this function is equivalent to EnumWindows. Windows 95/98/Me: parent cannot be NULL.
539
+ # *Original* Parameters:
540
+ # hWndParent:: [in] Handle to the parent window whose child windows are to be enumerated. If this parameter
541
+ # is NULL, this function is equivalent to EnumWindows.
542
+ # Windows 95/98/Me: hWndParent cannot be NULL.
543
+ # lpEnumFunc:: [in] Pointer to an application-defined callback. For more information, see EnumChildProc.
544
+ # lParam:: [in] Specifies an application-defined value to be passed to the callback function.
445
545
  #
546
+ # *Return*:: Not used!
547
+ # ---
446
548
  # API improved to accept blocks (instead of callback objects) and parent handle (value is optional, default 0)
447
- # New Parameters:
448
- # parent (L) - Handle to the parent window whose child windows are to be enumerated.
449
- # value (P) - Specifies an application-defined value(message) to be passed to the callback function.
450
- # block given to method invocation serves as an application-defined callback function (see EnumChildProc).
451
549
  #
452
- # Remarks:
453
- # If a child window has created child windows of its own, EnumChildWindows enumerates those windows as well.
454
- # A child window that is moved or repositioned in the Z order during the enumeration process will be properly enumerated.
455
- # The function does not enumerate a child window that is destroyed before being enumerated or that is created during the enumeration process.
550
+ # *New* Parameters:
551
+ # parent:: Handle to the parent window whose child windows are to be enumerated.
552
+ # value:: Specifies an application-defined value(message) to be passed to the callback function.
553
+ # attached block:: Serves as an application-defined callback function (see EnumWindowsProc).
554
+ # ---
555
+ # *Remarks*:
556
+ # - If a child window has created child windows of its own, EnumChildWindows enumerates those windows as well.
557
+ # - A child window that is moved or repositioned in the Z order during the enumeration process will be properly
558
+ # enumerated. The function does not enumerate a child window that is destroyed before being enumerated or that
559
+ # is created during the enumeration process.
456
560
  #
457
561
  #:call-seq:
458
562
  # handles = enum_child_windows( parent_handle, [value=0] ) {|handle, value| your callback procedure }
459
563
  #
460
- function 'EnumChildWindows', [:ulong, :enum_callback, :long], :bool, &return_enum
564
+ function :EnumChildWindows, [:ulong, :EnumWindowsProc, :long], :bool, &return_enum
461
565
 
462
566
  ##
463
567
  # GetForegroundWindow function returns a handle to the foreground window (the window with which the user
464
568
  # is currently working). The system assigns a slightly higher priority to the thread that creates the
465
569
  # foreground window than it does to other threads.
466
570
  #
467
- # Syntax: HWND GetForegroundWindow(VOID);
571
+ # [*Syntax*] HWND GetForegroundWindow(VOID);
468
572
  #
469
- # Return Value: The return value is a handle to the foreground window. The foreground window can be NULL in
470
- # certain circumstances, such as when a window is losing activation.
573
+ # *Returns*:: The return value is a handle to the foreground window. The foreground window can be NULL in
574
+ # certain circumstances, such as when a window is losing activation.
471
575
  #
472
576
  #:call-seq:
473
577
  # win_handle = [get_]foreground_window()
474
578
  #
475
- function 'GetForegroundWindow', [], 'L'
579
+ function :GetForegroundWindow, [], :ulong, zeronil: true
476
580
 
477
581
  ##
478
582
  # The GetActiveWindow function retrieves the window handle to the active window attached to
479
583
  # the calling thread's message queue.
480
584
  #
481
- # Syntax: HWND GetActiveWindow(VOID);
585
+ # [*Syntax*] HWND GetActiveWindow(VOID);
482
586
  #
483
- # Return Value: The return value is the handle to the active window attached to the calling
484
- # thread's message queue. Otherwise, the return value is NULL.
587
+ # *Returns*:: The return value is the handle to the active window attached to the calling
588
+ # thread's message queue. Otherwise, the return value is NULL.
485
589
  #
486
590
  # Remarks: To get the handle to the foreground window, you can use GetForegroundWindow.
487
591
  # To get the window handle to the active window in the message queue for another thread, use GetGUIThreadInfo.
@@ -489,8 +593,23 @@ module Win
489
593
  #:call-seq:
490
594
  # win_handle = [get_]active_window()
491
595
  #
492
- function 'GetActiveWindow', [], 'L'
596
+ function :GetActiveWindow, [], :ulong, zeronil: true
493
597
 
598
+ # Convenience wrapper methods:
599
+
600
+ ##
601
+ # Hides the window and activates another window
602
+ #
603
+ def hide_window(win_handle)
604
+ show_window(win_handle, SW_HIDE)
605
+ end
606
+
607
+ ##
608
+ # Tests if given window handle points to foreground (topmost) window
609
+ #
610
+ def foreground?(win_handle)
611
+ win_handle == foreground_window
612
+ end
494
613
  end
495
614
  end
496
615
  end