Форум программистов, компьютерный форум, киберфорум
Наши страницы
PowerShell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Kavaru
2 / 2 / 1
Регистрация: 07.07.2015
Сообщений: 15
Завершенные тесты: 1
#1

Как выбрать окно, если его handle не совпадает с handle процесса?

07.07.2015, 18:55. Просмотров 903. Ответов 4
Метки нет (Все метки)

Добрый день!

Задача на первый взгляд довольно простая: выбрать окно программы, переместить его в определённую часть экрана и нажать на нём несколько кнопок. С калькуляторами/блокнотами всё работает, но нужная программа создана каким-то хитрым способом.
Это выражается следующим образом: при получении handle процесса через Get-Process я получаю одно значение, а при получении handle окна с помощью AutoIt - другое. Причём второго значения в списке вообще нет. (Использовал Get-Process | ft MainWindowHandle )

Пробовал использовать WASP. Через Select-Window выбирается скрытое пустое окно, которое, по видимому, является управляющим, но перейти от него к нужному окну - не получилось.

На просторах интернета нашел вот такой код:
PowerShell
1
2
add-type -name win -member '[DllImport("user32.dll")] public static extern bool SetForegroundWindow(int handle);' -namespace native
[native.win]::SetForegroundWindow($handle)
При подстановке обоих значений handle нужное окно становится активным. Но как подобным образом получить окно в качестве объекта для PS - я не разобрался.

Собственно вопрос: в каком направлении искать способ обратиться к такому окну?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2015, 18:55
Ответы с готовыми решениями:

Handle и title
Всем доброго дня! Столкнулся с определенной проблемой при решении одной...

Как узнать Handle или PID процесса, зная его имя и класс?
Как узнать Handle или PID процесса, зная его имя и класс?

Получить имя процесса по его handle
Всем привет, ищу статью по получению имени из хендла процесса. Кому не трудно,...

Ошибка при открытии процесса по его Handle
Здравствуйте, столкнулся с проблемой открытия процесса, вот код: #include...

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

4
greg zakharov
Покинул форум
1947 / 823 / 236
Регистрация: 07.05.2015
Сообщений: 1,645
07.07.2015, 21:12 #2
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#пример того, как можно переключиться на окно запущенного ранее Блокнота...
Add-Type -AssemblyName ($a = 'System.Windows.Forms')
 
$FindWindow = ($unm = ($asm = [AppDomain]::CurrentDomain.GetAssemblies() | ? {
  $_.ManifestModule.ScopeName.Equals("$a.dll")
}).GetType("$a.UnsafeNativeMethods")).GetMethod('FindWindow')
$SetForegroundWindow = $unm.GetMethod('SetForegroundWindow')
$ShowWindow = $asm.GetType("$a.SafeNativeMethods").GetMethod('ShowWindow')
 
if (($ptr = $FindWindow.Invoke($null, @('Notepad', $null))) -eq [IntPtr]::Zero) {
  "Невозможно найти окно Блокнота.`n"
  break
}
 
[Runtime.InteropServices.HandleRef]$href = New-Object Runtime.InteropServices.HandleRef(
  (New-Object IntPtr), $ptr
)
 
[void]$SetForegroundWindow.Invoke($null, @($href))
[void]$ShowWindow.Invoke($null, @($href, 5))
 
#...и того, как изменить его размер и положение
$asm = Add-Type -MemberDefinition @'
  [DllImport("user32.dll")]
  public static extern Boolean MoveWindow(
      IntPtr hWnd,
      Int32  x,
      Int32  y,
      Int32  nWidth,
      Int32  nHeight,
      Boolean bRepaint
  );
'@ -Name Win -NameSpace Win32API -PassThru
[void]$asm::MoveWindow($ptr, 1230, 750, 200, 100, $true)
0
Kavaru
2 / 2 / 1
Регистрация: 07.07.2015
Сообщений: 15
Завершенные тесты: 1
08.07.2015, 12:11  [ТС] #3
greg zakharov, с блокнотом-то работает, а вот окно запущенного ранее Файрфокса найти не может.
В то время как, например:
PowerShell
1
2
Get-Process | where {$_.ProcessName -like "firefox"}
Get-Process | where {$_.ProcessName -like "notepad"}
показывают оба процесса.
0
greg zakharov
Покинул форум
1947 / 823 / 236
Регистрация: 07.05.2015
Сообщений: 1,645
08.07.2015, 21:33 #4
Цитата Сообщение от Kavaru
а вот окно запущенного ранее Файрфокса найти не может.
Spy++ или его аналог Вам в руки, а также рекомендуется чтение MSDN относительно FindWindow. И не нужно городить огород из двух командлетов, когда достаточно:
PowerShell
ps firefox
или
PowerShell
ps notepad
1
Kavaru
2 / 2 / 1
Регистрация: 07.07.2015
Сообщений: 15
Завершенные тесты: 1
17.07.2015, 15:19  [ТС] #5
Спасибо за помощь. Через Spy++ смог найти нужное окно и узнать его класс.
А затем получить его handle следующим способом:
PowerShell
1
2
3
4
5
6
7
8
9
$signature = @"
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
"@ 
 
$win = Add-Type -MemberDefinition $signature -Name Window `
-Namespace UseWinAPI -passThru 
 
$win::FindWindow(“класс“,“название“) }
0
17.07.2015, 15:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2015, 15:19

Как найти Handle окна процесса?
Здраствуйте! Вот решил розобраться какие в C# есть возможности для роботы с...

Как узнать handle окна по ID процесса
Коллеги, подскажите, что делать. Ситуация в двух словах такая: нужно сделать...

Можно ли вставить свой собственный контрол в чужое окно, зная его handle?
Можно ли вставить свой собственный контрол в чужое окно, если я знаю его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru