rdp-rautomation 0.6.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. data/.document +5 -0
  2. data/.rspec +2 -0
  3. data/.yardopts +6 -0
  4. data/History.rdoc +103 -0
  5. data/LICENSE +20 -0
  6. data/README.rdoc +114 -0
  7. data/Rakefile +43 -0
  8. data/VERSION +1 -0
  9. data/ext/AutoItX/AutoItX.chm +0 -0
  10. data/ext/AutoItX/AutoItX3.dll +0 -0
  11. data/ext/IAccessibleDLL/IAccessibleDLL.sln +20 -0
  12. data/ext/IAccessibleDLL/IAccessibleDLL.suo +0 -0
  13. data/ext/IAccessibleDLL/IAccessibleDLL/IAccessibleDLL.cpp +30 -0
  14. data/ext/IAccessibleDLL/IAccessibleDLL/IAccessibleDLL.vcxproj +102 -0
  15. data/ext/IAccessibleDLL/IAccessibleDLL/IAccessibleDLL.vcxproj.filters +42 -0
  16. data/ext/IAccessibleDLL/IAccessibleDLL/IAccessibleDLL.vcxproj.user +3 -0
  17. data/ext/IAccessibleDLL/IAccessibleDLL/ReadMe.txt +48 -0
  18. data/ext/IAccessibleDLL/IAccessibleDLL/dllmain.cpp +19 -0
  19. data/ext/IAccessibleDLL/IAccessibleDLL/stdafx.cpp +8 -0
  20. data/ext/IAccessibleDLL/IAccessibleDLL/stdafx.h +22 -0
  21. data/ext/IAccessibleDLL/IAccessibleDLL/table_support.cpp +282 -0
  22. data/ext/IAccessibleDLL/IAccessibleDLL/targetver.h +8 -0
  23. data/ext/IAccessibleDLL/Release/IAccessibleDLL.dll +0 -0
  24. data/ext/ListViewExplorer/ListViewExplorer.sln +20 -0
  25. data/ext/ListViewExplorer/ListViewExplorer.suo +0 -0
  26. data/ext/ListViewExplorer/ListViewExplorer/ListViewExplorer.cpp +174 -0
  27. data/ext/ListViewExplorer/ListViewExplorer/ListViewExplorer.vcxproj +95 -0
  28. data/ext/ListViewExplorer/ListViewExplorer/ListViewExplorer.vcxproj.filters +42 -0
  29. data/ext/ListViewExplorer/ListViewExplorer/ListViewExplorer.vcxproj.user +3 -0
  30. data/ext/ListViewExplorer/ListViewExplorer/ReadMe.txt +40 -0
  31. data/ext/ListViewExplorer/ListViewExplorer/stdafx.cpp +8 -0
  32. data/ext/ListViewExplorer/ListViewExplorer/stdafx.h +17 -0
  33. data/ext/ListViewExplorer/ListViewExplorer/table_support.cpp +250 -0
  34. data/ext/ListViewExplorer/ListViewExplorer/table_support.h +2 -0
  35. data/ext/ListViewExplorer/ListViewExplorer/targetver.h +8 -0
  36. data/ext/UiaDll/Release/UiaDll.dll +0 -0
  37. data/ext/UiaDll/UiaDll.sln +20 -0
  38. data/ext/UiaDll/UiaDll.suo +0 -0
  39. data/ext/UiaDll/UiaDll/ReadMe.txt +48 -0
  40. data/ext/UiaDll/UiaDll/UiaDll.cpp +205 -0
  41. data/ext/UiaDll/UiaDll/UiaDll.vcxproj +104 -0
  42. data/ext/UiaDll/UiaDll/UiaDll.vcxproj.filters +42 -0
  43. data/ext/UiaDll/UiaDll/dllmain.cpp +39 -0
  44. data/ext/UiaDll/UiaDll/globals.h +3 -0
  45. data/ext/UiaDll/UiaDll/stdafx.cpp +8 -0
  46. data/ext/UiaDll/UiaDll/stdafx.h +19 -0
  47. data/ext/UiaDll/UiaDll/targetver.h +8 -0
  48. data/ext/WindowsForms/bin/WindowsForms.exe +0 -0
  49. data/ext/WindowsForms/src/WindowsForms/WindowsForms.sln +20 -0
  50. data/ext/WindowsForms/src/WindowsForms/WindowsForms.suo +0 -0
  51. data/ext/WindowsForms/src/WindowsForms/WindowsForms/AboutBox.Designer.cs +80 -0
  52. data/ext/WindowsForms/src/WindowsForms/WindowsForms/AboutBox.cs +103 -0
  53. data/ext/WindowsForms/src/WindowsForms/WindowsForms/AboutBox.resx +120 -0
  54. data/ext/WindowsForms/src/WindowsForms/WindowsForms/DataEntryForm.Designer.cs +187 -0
  55. data/ext/WindowsForms/src/WindowsForms/WindowsForms/DataEntryForm.cs +46 -0
  56. data/ext/WindowsForms/src/WindowsForms/WindowsForms/DataEntryForm.resx +120 -0
  57. data/ext/WindowsForms/src/WindowsForms/WindowsForms/MainFormWindow.Designer.cs +377 -0
  58. data/ext/WindowsForms/src/WindowsForms/WindowsForms/MainFormWindow.cs +78 -0
  59. data/ext/WindowsForms/src/WindowsForms/WindowsForms/MainFormWindow.resx +120 -0
  60. data/ext/WindowsForms/src/WindowsForms/WindowsForms/PersonForm.Designer.cs +119 -0
  61. data/ext/WindowsForms/src/WindowsForms/WindowsForms/PersonForm.cs +34 -0
  62. data/ext/WindowsForms/src/WindowsForms/WindowsForms/PersonForm.resx +120 -0
  63. data/ext/WindowsForms/src/WindowsForms/WindowsForms/Program.cs +21 -0
  64. data/ext/WindowsForms/src/WindowsForms/WindowsForms/Properties/AssemblyInfo.cs +36 -0
  65. data/ext/WindowsForms/src/WindowsForms/WindowsForms/Properties/Resources.Designer.cs +71 -0
  66. data/ext/WindowsForms/src/WindowsForms/WindowsForms/Properties/Resources.resx +117 -0
  67. data/ext/WindowsForms/src/WindowsForms/WindowsForms/Properties/Settings.Designer.cs +30 -0
  68. data/ext/WindowsForms/src/WindowsForms/WindowsForms/Properties/Settings.settings +7 -0
  69. data/ext/WindowsForms/src/WindowsForms/WindowsForms/SimpleElementsForm.Designer.cs +93 -0
  70. data/ext/WindowsForms/src/WindowsForms/WindowsForms/SimpleElementsForm.cs +19 -0
  71. data/ext/WindowsForms/src/WindowsForms/WindowsForms/SimpleElementsForm.resx +120 -0
  72. data/ext/WindowsForms/src/WindowsForms/WindowsForms/WindowsForms.csproj +123 -0
  73. data/ext/WindowsForms/src/WindowsForms/WindowsForms/bin/Release/WindowsForms.exe +0 -0
  74. data/lib/rautomation.rb +6 -0
  75. data/lib/rautomation/adapter/autoit.rb +5 -0
  76. data/lib/rautomation/adapter/autoit/button.rb +59 -0
  77. data/lib/rautomation/adapter/autoit/locators.rb +22 -0
  78. data/lib/rautomation/adapter/autoit/text_field.rb +61 -0
  79. data/lib/rautomation/adapter/autoit/window.rb +184 -0
  80. data/lib/rautomation/adapter/helper.rb +20 -0
  81. data/lib/rautomation/adapter/win_ffi.rb +21 -0
  82. data/lib/rautomation/adapter/win_ffi/button.rb +25 -0
  83. data/lib/rautomation/adapter/win_ffi/button_helper.rb +24 -0
  84. data/lib/rautomation/adapter/win_ffi/checkbox.rb +19 -0
  85. data/lib/rautomation/adapter/win_ffi/constants.rb +94 -0
  86. data/lib/rautomation/adapter/win_ffi/control.rb +79 -0
  87. data/lib/rautomation/adapter/win_ffi/functions.rb +333 -0
  88. data/lib/rautomation/adapter/win_ffi/keystroke_converter.rb +67 -0
  89. data/lib/rautomation/adapter/win_ffi/label.rb +21 -0
  90. data/lib/rautomation/adapter/win_ffi/list_box.rb +60 -0
  91. data/lib/rautomation/adapter/win_ffi/locators.rb +22 -0
  92. data/lib/rautomation/adapter/win_ffi/ms_uia/uia_dll.rb +36 -0
  93. data/lib/rautomation/adapter/win_ffi/radio.rb +19 -0
  94. data/lib/rautomation/adapter/win_ffi/select_list.rb +87 -0
  95. data/lib/rautomation/adapter/win_ffi/table.rb +57 -0
  96. data/lib/rautomation/adapter/win_ffi/text_field.rb +52 -0
  97. data/lib/rautomation/adapter/win_ffi/window.rb +226 -0
  98. data/lib/rautomation/button.rb +55 -0
  99. data/lib/rautomation/element_collections.rb +47 -0
  100. data/lib/rautomation/text_field.rb +60 -0
  101. data/lib/rautomation/wait_helper.rb +23 -0
  102. data/lib/rautomation/window.rb +234 -0
  103. data/spec/adapter/win_ffi/button_spec.rb +41 -0
  104. data/spec/adapter/win_ffi/checkbox_spec.rb +48 -0
  105. data/spec/adapter/win_ffi/keystroke_converter_spec.rb +47 -0
  106. data/spec/adapter/win_ffi/label_spec.rb +21 -0
  107. data/spec/adapter/win_ffi/listbox_spec.rb +52 -0
  108. data/spec/adapter/win_ffi/radio_spec.rb +37 -0
  109. data/spec/adapter/win_ffi/select_list_spec.rb +66 -0
  110. data/spec/adapter/win_ffi/table_spec.rb +39 -0
  111. data/spec/adapter/win_ffi/text_field_spec.rb +23 -0
  112. data/spec/adapter/win_ffi/window_spec.rb +43 -0
  113. data/spec/button_spec.rb +68 -0
  114. data/spec/buttons_spec.rb +21 -0
  115. data/spec/spec_helper.rb +96 -0
  116. data/spec/text_field_spec.rb +65 -0
  117. data/spec/text_fields_spec.rb +22 -0
  118. data/spec/window_spec.rb +122 -0
  119. data/spec/windows_spec.rb +55 -0
  120. metadata +207 -0
@@ -0,0 +1,123 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3
+ <PropertyGroup>
4
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5
+ <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
6
+ <ProductVersion>8.0.30703</ProductVersion>
7
+ <SchemaVersion>2.0</SchemaVersion>
8
+ <ProjectGuid>{79C33EDA-58C4-41EF-93DC-BA679895BD43}</ProjectGuid>
9
+ <OutputType>WinExe</OutputType>
10
+ <AppDesignerFolder>Properties</AppDesignerFolder>
11
+ <RootNamespace>WindowsForms</RootNamespace>
12
+ <AssemblyName>WindowsForms</AssemblyName>
13
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
14
+ <TargetFrameworkProfile>Client</TargetFrameworkProfile>
15
+ <FileAlignment>512</FileAlignment>
16
+ </PropertyGroup>
17
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
18
+ <PlatformTarget>x86</PlatformTarget>
19
+ <DebugSymbols>true</DebugSymbols>
20
+ <DebugType>full</DebugType>
21
+ <Optimize>false</Optimize>
22
+ <OutputPath>bin\Debug\</OutputPath>
23
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
24
+ <ErrorReport>prompt</ErrorReport>
25
+ <WarningLevel>4</WarningLevel>
26
+ </PropertyGroup>
27
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
28
+ <PlatformTarget>x86</PlatformTarget>
29
+ <DebugType>pdbonly</DebugType>
30
+ <Optimize>true</Optimize>
31
+ <OutputPath>bin\Release\</OutputPath>
32
+ <DefineConstants>TRACE</DefineConstants>
33
+ <ErrorReport>prompt</ErrorReport>
34
+ <WarningLevel>4</WarningLevel>
35
+ </PropertyGroup>
36
+ <ItemGroup>
37
+ <Reference Include="System" />
38
+ <Reference Include="System.Core" />
39
+ <Reference Include="System.Xml.Linq" />
40
+ <Reference Include="System.Data.DataSetExtensions" />
41
+ <Reference Include="Microsoft.CSharp" />
42
+ <Reference Include="System.Data" />
43
+ <Reference Include="System.Deployment" />
44
+ <Reference Include="System.Drawing" />
45
+ <Reference Include="System.Windows.Forms" />
46
+ <Reference Include="System.Xml" />
47
+ </ItemGroup>
48
+ <ItemGroup>
49
+ <Compile Include="AboutBox.cs">
50
+ <SubType>Form</SubType>
51
+ </Compile>
52
+ <Compile Include="AboutBox.Designer.cs">
53
+ <DependentUpon>AboutBox.cs</DependentUpon>
54
+ </Compile>
55
+ <Compile Include="DataEntryForm.cs">
56
+ <SubType>Form</SubType>
57
+ </Compile>
58
+ <Compile Include="DataEntryForm.Designer.cs">
59
+ <DependentUpon>DataEntryForm.cs</DependentUpon>
60
+ </Compile>
61
+ <Compile Include="SimpleElementsForm.cs">
62
+ <SubType>Form</SubType>
63
+ </Compile>
64
+ <Compile Include="SimpleElementsForm.Designer.cs">
65
+ <DependentUpon>SimpleElementsForm.cs</DependentUpon>
66
+ </Compile>
67
+ <Compile Include="PersonForm.cs">
68
+ <SubType>Form</SubType>
69
+ </Compile>
70
+ <Compile Include="PersonForm.Designer.cs">
71
+ <DependentUpon>PersonForm.cs</DependentUpon>
72
+ </Compile>
73
+ <Compile Include="MainFormWindow.cs">
74
+ <SubType>Form</SubType>
75
+ </Compile>
76
+ <Compile Include="MainFormWindow.Designer.cs">
77
+ <DependentUpon>MainFormWindow.cs</DependentUpon>
78
+ </Compile>
79
+ <Compile Include="Program.cs" />
80
+ <Compile Include="Properties\AssemblyInfo.cs" />
81
+ <EmbeddedResource Include="AboutBox.resx">
82
+ <DependentUpon>AboutBox.cs</DependentUpon>
83
+ </EmbeddedResource>
84
+ <EmbeddedResource Include="DataEntryForm.resx">
85
+ <DependentUpon>DataEntryForm.cs</DependentUpon>
86
+ </EmbeddedResource>
87
+ <EmbeddedResource Include="SimpleElementsForm.resx">
88
+ <DependentUpon>SimpleElementsForm.cs</DependentUpon>
89
+ </EmbeddedResource>
90
+ <EmbeddedResource Include="PersonForm.resx">
91
+ <DependentUpon>PersonForm.cs</DependentUpon>
92
+ </EmbeddedResource>
93
+ <EmbeddedResource Include="MainFormWindow.resx">
94
+ <DependentUpon>MainFormWindow.cs</DependentUpon>
95
+ </EmbeddedResource>
96
+ <EmbeddedResource Include="Properties\Resources.resx">
97
+ <Generator>ResXFileCodeGenerator</Generator>
98
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
99
+ <SubType>Designer</SubType>
100
+ </EmbeddedResource>
101
+ <Compile Include="Properties\Resources.Designer.cs">
102
+ <AutoGen>True</AutoGen>
103
+ <DependentUpon>Resources.resx</DependentUpon>
104
+ </Compile>
105
+ <None Include="Properties\Settings.settings">
106
+ <Generator>SettingsSingleFileGenerator</Generator>
107
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
108
+ </None>
109
+ <Compile Include="Properties\Settings.Designer.cs">
110
+ <AutoGen>True</AutoGen>
111
+ <DependentUpon>Settings.settings</DependentUpon>
112
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
113
+ </Compile>
114
+ </ItemGroup>
115
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
116
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
117
+ Other similar extension points exist, see Microsoft.Common.targets.
118
+ <Target Name="BeforeBuild">
119
+ </Target>
120
+ <Target Name="AfterBuild">
121
+ </Target>
122
+ -->
123
+ </Project>
@@ -0,0 +1,6 @@
1
+ require "rautomation/wait_helper"
2
+ require "rautomation/adapter/helper"
3
+ require "rautomation/button"
4
+ require "rautomation/text_field"
5
+ require "rautomation/element_collections"
6
+ require "rautomation/window"
@@ -0,0 +1,5 @@
1
+ require "win32ole"
2
+ require File.dirname(__FILE__) + "/autoit/locators"
3
+ require File.dirname(__FILE__) + "/autoit/button"
4
+ require File.dirname(__FILE__) + "/autoit/text_field"
5
+ require File.dirname(__FILE__) + "/autoit/window"
@@ -0,0 +1,59 @@
1
+ module RAutomation
2
+ module Adapter
3
+ module Autoit
4
+ class Button
5
+ include WaitHelper
6
+ include Locators
7
+
8
+ # Default locators used for searching buttons.
9
+ DEFAULT_LOCATORS = {:class => /button/i}
10
+
11
+ # @private
12
+ # Special-cased locators
13
+ LOCATORS = {
14
+ [:class, Regexp] => :regexpclass,
15
+ :index => :instance,
16
+ :value => :text
17
+ }
18
+
19
+ # Creates the button object.
20
+ # @note this method is not meant to be accessed directly, but only through {RAutomation::Window#button}!
21
+ # @param [RAutomation::Window] window this button belongs to.
22
+ # @param [Hash] locators for searching the button.
23
+ # @option locators [String, Regexp] :value Value (text) of the button
24
+ # @option locators [String, Regexp] :class Internal class name of the button
25
+ # @option locators [String, Fixnum] :id Internal ID of the button
26
+ # @option locators [String, Fixnum] :index 0-based index to specify n-th button if all other criteria match
27
+ # @see RAutomation::Window#button
28
+ def initialize(window, locators)
29
+ @window = window
30
+ extract(locators)
31
+ end
32
+
33
+ # @see RAutomation::Button#click
34
+ def click
35
+ clicked = false
36
+ wait_until do
37
+ @window.activate
38
+ @window.active? &&
39
+ Window.autoit.ControlFocus(@window.locator_hwnd, "", @autoit_locators) == 1 &&
40
+ Window.autoit.ControlClick(@window.locator_hwnd, "", @autoit_locators) == 1 &&
41
+ clicked = true # is clicked at least once
42
+
43
+ block_given? ? yield : clicked && !exists?
44
+ end
45
+ end
46
+
47
+ # @see RAutomation::Button#value
48
+ def value
49
+ Window.autoit.ControlGetText(@window.locator_hwnd, "", @autoit_locators)
50
+ end
51
+
52
+ # @see RAutomation::Button#exists?
53
+ def exists?
54
+ not Window.autoit.ControlGetHandle(@window.locator_hwnd, "", @autoit_locators).empty?
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,22 @@
1
+ module RAutomation
2
+ module Adapter
3
+ module Autoit
4
+ # @private
5
+ module Locators
6
+
7
+ private
8
+
9
+ def extract(locators)
10
+ locators = self.class::DEFAULT_LOCATORS.merge(locators) if self.class.const_defined?(:DEFAULT_LOCATORS)
11
+ @locators = locators
12
+ @autoit_locators = "[#{@locators.map do |locator, value|
13
+ locator_key = self.class::LOCATORS[locator] || self.class::LOCATORS[[locator, value.class]]
14
+ value = value.to_i + 1 if locator == :index # use 0-based indexing
15
+ value = value.to_s(16) if locator == :hwnd
16
+ "#{(locator_key || locator)}:#{value}"
17
+ end.join(";")}]"
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,61 @@
1
+ module RAutomation
2
+ module Adapter
3
+ module Autoit
4
+ class TextField
5
+ include WaitHelper
6
+ include Locators
7
+
8
+ # Default locators used for searching text fields.
9
+ DEFAULT_LOCATORS = {:class => /edit/i}
10
+
11
+ # @private
12
+ # Special-cased locators
13
+ LOCATORS = {
14
+ [:class, Regexp] => :regexpclass,
15
+ :index => :instance,
16
+ :value => :text
17
+ }
18
+
19
+ # Creates the text field object.
20
+ # @note this method is not meant to be accessed directly, but only through {RAutomation::Window#text_field}!
21
+ # @param [RAutomation::Window] window this text field belongs to.
22
+ # @param [Hash] locators for searching the text field.
23
+ # @option locators [String, Regexp] :class Internal class name of the text field
24
+ # @option locators [String, Regexp] :value Value (text) of the text field
25
+ # @option locators [String, Fixnum] :id Internal ID of the text field
26
+ # @option locators [String, Fixnum] :index 0-based index to specify n-th text field if all other criteria match
27
+ # @see RAutomation::Window#text_field
28
+ def initialize(window, locators)
29
+ @window = window
30
+ extract(locators)
31
+ end
32
+
33
+ # @see RAutomation::TextField#set
34
+ def set(text)
35
+ wait_until do
36
+ @window.activate
37
+ @window.active? &&
38
+ Window.autoit.ControlFocus(@window.locator_hwnd, "", @autoit_locators) == 1 &&
39
+ Window.autoit.ControlSetText(@window.locator_hwnd, "", @autoit_locators, text) == 1 &&
40
+ value == text
41
+ end
42
+ end
43
+
44
+ # @see RAutomation::TextField#clear
45
+ def clear
46
+ set ""
47
+ end
48
+
49
+ # @see RAutomation::TextField#value
50
+ def value
51
+ Window.autoit.ControlGetText(@window.locator_hwnd, "", @autoit_locators)
52
+ end
53
+
54
+ # @see RAutomation::TextField#exists?
55
+ def exists?
56
+ not Window.autoit.ControlGetHandle(@window.locator_hwnd, "", @autoit_locators).empty?
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,184 @@
1
+ module RAutomation
2
+ module Adapter
3
+ module Autoit
4
+ class Window
5
+ include WaitHelper
6
+ include Locators
7
+
8
+ class << self
9
+ # @private
10
+ def autoit
11
+ @@autoit
12
+ end
13
+
14
+ # @private
15
+ def load_autoit
16
+ @@autoit = WIN32OLE.new('AutoItX3.Control')
17
+ rescue WIN32OLERuntimeError
18
+ dll = File.dirname(__FILE__) + "/../../../../ext/AutoItX/AutoItX3.dll"
19
+ system("regsvr32.exe /s #{dll.gsub('/', '\\')}")
20
+ @@autoit = WIN32OLE.new('AutoItX3.Control')
21
+ end
22
+ end
23
+
24
+ load_autoit
25
+ @@autoit.AutoItSetOption("WinWaitDelay", 350)
26
+
27
+ # Locators of the window.
28
+ attr_reader :locators
29
+
30
+ # @private
31
+ # Special-cased locators
32
+ LOCATORS = {
33
+ [:title, Regexp] => :regexptitle,
34
+ :index => :instance,
35
+ :hwnd => :handle
36
+ }
37
+
38
+ # Creates the window object.
39
+ # @note this method is not meant to be accessed directly, but only through {RAutomation::Window#initialize}!
40
+ # @param [Hash] locators for searching the window.
41
+ # @option locators [String, Regexp] :title Title of the window
42
+ # @option locators [String, Regexp] :text Visible text of the window
43
+ # @option locators [String, Regexp] :class Internal class name of the window
44
+ # @option locators [String, Fixnum] :hwnd Window handle in decimal format
45
+ # @option locators [String, Fixnum] :index 0-based index to specify n-th window if all other criteria match
46
+ # @see RAutomation::Window#initialize
47
+ def initialize(locators)
48
+ @hwnd = locators[:hwnd]
49
+ @locator_index = locators.delete(:index) if locators[:index] && locators.size == 1
50
+ @locator_pid = locators.delete(:pid).to_i if locators[:pid]
51
+ @locator_text = locators.delete(:text)
52
+ extract(locators)
53
+ end
54
+
55
+ # Retrieves handle of the window.
56
+ # @note Searches only for visible windows.
57
+ # @see RAutomation::Window#hwnd
58
+ def hwnd
59
+ @hwnd ||= begin
60
+ locators = @autoit_locators
61
+ if @locator_index || @locator_pid
62
+ # @todo Come up with some better solution for this case
63
+ locators = "[regexptitle:]" # match all, needed for the case when only :index or :pid is used
64
+ end
65
+ windows = @@autoit.WinList(locators, @locator_text).pop.compact.
66
+ map {|handle| self.class.new(:hwnd => handle.hex)}
67
+ windows.delete_if {|window| !window.visible?}
68
+
69
+ if @locator_pid
70
+ window = windows.find {|win| win.pid == @locator_pid}
71
+ else
72
+ window = windows[@locator_index || 0]
73
+ end
74
+ window ? window.hwnd : nil
75
+ end
76
+ end
77
+
78
+ # @see RAutomation::Window#pid
79
+ def pid
80
+ @@autoit.WinGetProcess(locator_hwnd).to_i
81
+ end
82
+
83
+ # @see RAutomation::Window#title
84
+ def title
85
+ @@autoit.WinGetTitle(locator_hwnd)
86
+ end
87
+
88
+ # @see RAutomation::Window#activate
89
+ def activate
90
+ @@autoit.WinWait(locator_hwnd, "", 1)
91
+ @@autoit.WinActivate(locator_hwnd)
92
+ sleep 1
93
+ end
94
+
95
+ # @see RAutomation::Window#active?
96
+ def active?
97
+ @@autoit.WinActive(locator_hwnd) == 1
98
+ end
99
+
100
+ # @see RAutomation::Window#text
101
+ def text
102
+ @@autoit.WinGetText(locator_hwnd)
103
+ end
104
+
105
+ # @see RAutomation::Window#exists?
106
+ def exists?
107
+ @@autoit.WinExists(locator_hwnd) == 1
108
+ end
109
+
110
+ # @see RAutomation::Window#visible?
111
+ def visible?
112
+ @@autoit.WinGetState(locator_hwnd) & 2 == 2
113
+ end
114
+
115
+ # @see RAutomation::Window#maximize
116
+ def maximize
117
+ @@autoit.WinSetState(locator_hwnd, "", @@autoit.SW_MAXIMIZE)
118
+ sleep 1
119
+ end
120
+
121
+ # @see RAutomation::Window#minimize
122
+ def minimize
123
+ @@autoit.WinSetState(locator_hwnd, "", @@autoit.SW_MINIMIZE)
124
+ sleep 1
125
+ end
126
+
127
+ # @see RAutomation::Window#minimized?
128
+ def minimized?
129
+ @@autoit.WinGetState(locator_hwnd) & 16 == 16
130
+ end
131
+
132
+ # @see RAutomation::Window#restore
133
+ def restore
134
+ @@autoit.WinSetState(locator_hwnd, "", @@autoit.SW_RESTORE)
135
+ sleep 1
136
+ end
137
+
138
+ # Activates the window and sends keys to it.
139
+ #
140
+ # Refer to AutoIt documentation at http://www.autoitscript.com/autoit3/docs/appendix/SendKeys.htm
141
+ # for keys syntax.
142
+ # @see RAutomation::Window#send_keys
143
+ def send_keys(keys)
144
+ wait_until do
145
+ activate
146
+ active?
147
+ end
148
+ @@autoit.Send(keys)
149
+ end
150
+
151
+ # @see RAutomation::Window#close
152
+ def close
153
+ @@autoit.WinClose(locator_hwnd)
154
+ @@autoit.WinKill(locator_hwnd)
155
+ end
156
+
157
+ # @see Button#initialize
158
+ # @see RAutomation::Window#button
159
+ def button(locator)
160
+ Button.new(self, locator)
161
+ end
162
+
163
+ # @see TextField#initialize
164
+ # @see RAutomation::Window#text_field
165
+ def text_field(locator)
166
+ TextField.new(self, locator)
167
+ end
168
+
169
+ # Redirects all method calls not part of the public API to the AutoIt directly.
170
+ # @example execute AutoIt's WinGetTitle function:
171
+ # RAutomation::Window.new(:hwnd => 123456).WinGetTitle(...)
172
+ # @see RAutomation::Window#method_missing
173
+ def method_missing(name, *args)
174
+ @@autoit.send(name, *args)
175
+ end
176
+
177
+ # @private
178
+ def locator_hwnd
179
+ "[HANDLE:#{hwnd.to_i.to_s(16)}]"
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end