win32-window 0.1.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +4 -0
- data/lib/win32/window/version.rb +1 -0
- data/lib/win32/window/window.rb +188 -0
- data/lib/win32/window.rb +2 -0
- metadata +66 -0
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
$version = '0.1.0.pre'
|
@@ -0,0 +1,188 @@
|
|
1
|
+
require 'win32/api'
|
2
|
+
include Win32
|
3
|
+
|
4
|
+
module Win32
|
5
|
+
class Rect < Struct.new(:left, :top, :right, :bottom)
|
6
|
+
end
|
7
|
+
|
8
|
+
class Point < Struct.new(:x, :y)
|
9
|
+
end
|
10
|
+
|
11
|
+
class Size < Struct.new(:width, :height)
|
12
|
+
end
|
13
|
+
|
14
|
+
class Window
|
15
|
+
def initialize(handle)
|
16
|
+
@handle = handle
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.find(opts = {})
|
20
|
+
matches = []
|
21
|
+
|
22
|
+
callback = API::Callback.new('LP', 'I') { |handle|
|
23
|
+
match = true
|
24
|
+
match &&= opts[:title].nil? || (get_title(handle) =~ opts[:title])
|
25
|
+
match &&= opts[:pid].nil? || (get_pid(handle) == opts[:pid])
|
26
|
+
|
27
|
+
if match
|
28
|
+
matches << Window.new(handle)
|
29
|
+
end
|
30
|
+
|
31
|
+
1
|
32
|
+
}
|
33
|
+
|
34
|
+
EnumWindows.call(callback, nil)
|
35
|
+
|
36
|
+
return matches
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.desktop
|
40
|
+
Window.new(GetDesktopWindow.call())
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.foreground
|
44
|
+
Window.new(GetForegroundWindow.call())
|
45
|
+
end
|
46
|
+
|
47
|
+
def title
|
48
|
+
Window.get_title(@handle)
|
49
|
+
end
|
50
|
+
|
51
|
+
def topmost=(topmost)
|
52
|
+
SetWindowPos.call(@handle, topmost ? HWND_TOPMOST : HWND_NOTTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE)
|
53
|
+
end
|
54
|
+
|
55
|
+
def minimize
|
56
|
+
CloseWindow.call(@handle)
|
57
|
+
end
|
58
|
+
|
59
|
+
def minimized?
|
60
|
+
IsIconic.call(@handle) != 0
|
61
|
+
end
|
62
|
+
|
63
|
+
def visible?
|
64
|
+
IsWindowVisible.call(@handle) != 0
|
65
|
+
end
|
66
|
+
|
67
|
+
def parent
|
68
|
+
parent = GetParent.call(@handle)
|
69
|
+
if parent == 0
|
70
|
+
nil
|
71
|
+
else
|
72
|
+
Window.new(parent)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def pid
|
77
|
+
Window.get_pid(@handle)
|
78
|
+
end
|
79
|
+
|
80
|
+
def move(x, y)
|
81
|
+
SetWindowPos.call(@handle, 0, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER)
|
82
|
+
end
|
83
|
+
|
84
|
+
def resize(width, height)
|
85
|
+
SetWindowPos.call(@handle, 0, 0, 0, width, height, SWP_NOMOVE | SWP_NOZORDER)
|
86
|
+
end
|
87
|
+
|
88
|
+
def location
|
89
|
+
g = geometry()
|
90
|
+
Point.new(g.left, g.top)
|
91
|
+
end
|
92
|
+
|
93
|
+
def size
|
94
|
+
g = geometry()
|
95
|
+
Size.new(g.right - g.left, g.bottom - g.top)
|
96
|
+
end
|
97
|
+
|
98
|
+
def geometry
|
99
|
+
rect = Window.buffer(4 * 4)
|
100
|
+
GetWindowRect.call(@handle, rect)
|
101
|
+
left, top, right, bottom = rect.unpack('LLLL')
|
102
|
+
return Rect.new(left, top, right, bottom)
|
103
|
+
end
|
104
|
+
|
105
|
+
def client_geometry
|
106
|
+
rect = Window.buffer(4 * 4)
|
107
|
+
GetClientRect.call(@handle, rect)
|
108
|
+
left, top, right, bottom = rect.unpack('LLLL')
|
109
|
+
|
110
|
+
width = right - left
|
111
|
+
height = bottom - top
|
112
|
+
|
113
|
+
point = point(left, top)
|
114
|
+
ClientToScreen.call(@handle, point)
|
115
|
+
screen_left, screen_top = point.unpack('LL')
|
116
|
+
|
117
|
+
return Rect.new(screen_left, screen_top, screen_left + width, screen_top + height)
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
def self.get_title(handle)
|
122
|
+
if GetWindowTextW.call(handle, buffer = "\0" * 1024, buffer.length) == 0
|
123
|
+
nil
|
124
|
+
else
|
125
|
+
buffer.force_encoding('utf-16LE').encode('utf-8').rstrip
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def self.get_pid(handle)
|
130
|
+
buf = buffer(4)
|
131
|
+
GetWindowThreadProcessId.call(handle, buf)
|
132
|
+
buf.unpack('L')[0]
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.buffer(bytes)
|
136
|
+
' ' * bytes
|
137
|
+
end
|
138
|
+
|
139
|
+
def point(x, y)
|
140
|
+
[x, y].pack('LL')
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
EnumWindows = API.new('EnumWindows', 'KP', 'L', 'user32')
|
145
|
+
GetWindowTextW = API.new('GetWindowTextW', 'LPI', 'I', 'user32')
|
146
|
+
|
147
|
+
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633519(v=vs.85).aspx
|
148
|
+
GetWindowRect = API.new('GetWindowRect', 'IP', 'L', 'user32')
|
149
|
+
|
150
|
+
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633503(v=vs.85).aspx
|
151
|
+
GetClientRect = API.new('GetClientRect', 'IP', 'L', 'user32')
|
152
|
+
|
153
|
+
# http://msdn.microsoft.com/en-us/library/windows/desktop/dd183434(v=vs.85).aspx
|
154
|
+
ClientToScreen = API.new('ClientToScreen', 'IP', 'L', 'user32')
|
155
|
+
|
156
|
+
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx
|
157
|
+
SetWindowPos = API.new('SetWindowPos', 'IIIIIII', 'L', 'user32')
|
158
|
+
|
159
|
+
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633522(v=vs.85).aspx
|
160
|
+
GetWindowThreadProcessId = API.new('GetWindowThreadProcessId', 'IP', 'L', 'user32')
|
161
|
+
|
162
|
+
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms632678(v=vs.85).aspx
|
163
|
+
CloseWindow = API.new('CloseWindow', 'I', 'L', 'user32')
|
164
|
+
|
165
|
+
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633504(v=vs.85).aspx
|
166
|
+
GetDesktopWindow = API.new('GetDesktopWindow', '', 'I', 'user32')
|
167
|
+
|
168
|
+
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633505(v=vs.85).aspx
|
169
|
+
GetForegroundWindow = API.new('GetForegroundWindow', '', 'I', 'user32')
|
170
|
+
|
171
|
+
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633510(v=vs.85).aspx
|
172
|
+
GetParent = API.new('GetParent', 'I', 'I', 'user32')
|
173
|
+
|
174
|
+
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633527(v=vs.85).aspx
|
175
|
+
IsIconic = API.new('IsIconic', 'I', 'I', 'user32')
|
176
|
+
|
177
|
+
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633530(v=vs.85).aspx
|
178
|
+
IsWindowVisible = API.new('IsWindowVisible', 'I', 'I', 'user32')
|
179
|
+
|
180
|
+
HWND_BOTTOM = 1
|
181
|
+
HWND_NOTTOPMOST = -2
|
182
|
+
HWND_TOP = 0
|
183
|
+
HWND_TOPMOST = -1
|
184
|
+
|
185
|
+
SWP_NOSIZE = 0x0001
|
186
|
+
SWP_NOZORDER = 0x0004
|
187
|
+
SWP_NOMOVE = 0x0002
|
188
|
+
end
|
data/lib/win32/window.rb
ADDED
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: win32-window
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0.pre
|
5
|
+
prerelease: 6
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Chris Schmich
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-07-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.9.2.2
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.9.2.2
|
30
|
+
description: ! " A Ruby library to work with Microsoft Windows' Win32 window management
|
31
|
+
APIs,\n including search, enumeration, and window manipulation.\n"
|
32
|
+
email: schmch@gmail.com
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- lib/win32/window/version.rb
|
38
|
+
- lib/win32/window/window.rb
|
39
|
+
- lib/win32/window.rb
|
40
|
+
- README.md
|
41
|
+
homepage: https://github.com/schmich/win32-window
|
42
|
+
licenses: []
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ! '>'
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: 1.3.1
|
59
|
+
requirements: []
|
60
|
+
rubyforge_project:
|
61
|
+
rubygems_version: 1.8.23
|
62
|
+
signing_key:
|
63
|
+
specification_version: 3
|
64
|
+
summary: Ruby interface to the Win32 window management APIs.
|
65
|
+
test_files: []
|
66
|
+
has_rdoc:
|