Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2016, 12:03   #1
ivanik
Пользователь
 
Регистрация: 16.04.2016
Сообщений: 11
По умолчанию Работа в чужом окне архиватора

Здравствуйте;
Мне нужно программно работать с самораспаковывающимся запароленым архивом.
Вот тестовый фрагмент одного из вариантов кода:
//находим окно архиватора]
Код:
h1 := FindWindow(nil, 'Самораспаковывающийся архив WinRAR');
//Находим ХЭНДЛ ComboBox
h2 := FindWindowEx(h1,0,'ComboBox',nil);
 //Находим ХЭНДЛ поля EDIT C:\Documents and Settings\User\Рабочий стол
h3 := FindWindowEx(h2,0,'Edit',nil);
 //вводим в поле C:\Documents and Settings\User\Рабочий стол нужный путь
SendMessage(h3, WM_SETTEXT, 0, lparam(pchar(Put1)));
//Находим кнопку "Извлечь"
h4 := FindWindowEx(h1,0,'Button','Извлечь');
//Жмем на кнопку "Извлечь"
if h4<>0 then sendmessage(h4,BM_CLICK,0,0);
end;
//ДО ЭТОГО ВСЕ ВЫПОЛНЯЕТСЯ (появляется окно подтверждения замены или ввода пароля)


//Если появляется окно подтверждения замены файла то ищем его дескриптор...
//ЗДЕСЬ ПРОБЛЕМА С ПОИСКОМ ДЕСКРИПТОРА этого окна
//Проверяем присутствие окна подтверждение замены файлов
if findwindow(nil, 'Подтверждение замены файла') = 0 then
begin
//считываем его дескриптор
h5:=FindWindow(nil, 'Подтверждение замены файла');
//Находим кнопку "Да для всех"
h6:=FindWindowEx(h5,0,'Button','Да для &всех');
//жмем на кнопку "Да для всех"
if (h6<>0) then  sendmessage(h6,BM_CLICK,0,0);
//ПОЯВЛЯЕТСЯ ОКНО ВВОДА ПАРОЛЯ

//Находим окно ввода пароля
if findwindow(nil, 'Ввод пароля') = 0 then h7:=FindWindow(nil, 'Ввод пароля');
//Находим поле Edit ввода пароля
h8 := FindWindowEx(h7,0,'Edit',nil);
//Вводим пароль в поле Edit
SendMessage(h8, WM_SETTEXT, 0, lparam(pchar('12345')));  
sleep(1000);
//Находим кнопку ОК для подтверждения ввода пароля
h9:=GetNextWindow(h7,GW_HWNDNEXT);
//жмем на кнопку "ОК"
 if h9<>0 then  SendMessage(h9,BM_CLICK,0,0);

 end
 else //если окно подтверждения замены файлов не выходит тогда вводим пароль
 begin  
//ПОЯВЛЯЕТСЯ ОКНО ВВОДА ПАРОЛЯ


//ЗДЕСЬ ПРОБЛЕМА С ПОИСКОМ ДЕСКРИПТОРА окна ВВОДА ПАРОЛЯ
//Находим окно ввода пароля
if findwindow(nil, 'Ввод пароля') = 0 then h7:=FindWindow(nil, 'Ввод пароля');
//Находим поле Edit ввода пароля
h8 := FindWindowEx(h7,0,'Edit',nil);
//Вводим пароль в поле Edit
SendMessage(h8, WM_SETTEXT, 0, lparam(pchar('12345')));  
sleep(1000);
//Находим кнопку ОК для подтверждения ввода пароля
h9:=GetNextWindow(h7,GW_HWNDNEXT);
//жмем на кнопку "ОК"
 if h9<>0 then  SendMessage(h9,BM_CLICK,0,0);
 end;
Ни как не могу получить дескриптор окна замены файлов и окна ввода пароля.
Пробовал использовать функции GetForegroundWindow, но все равно
не получается.
Прилагаю рисунки архиватора и программы SPY++.
Может, кто то имел дело с подобной задачей, то прошу помочь.
Изображения
Тип файла: jpg pic2.JPG (41.6 Кб, 176 просмотров)
Тип файла: jpg pic3.JPG (57.6 Кб, 94 просмотров)
Тип файла: jpg pic1.JPG (34.7 Кб, 131 просмотров)
Тип файла: jpg pic4.JPG (19.4 Кб, 132 просмотров)

Последний раз редактировалось ivanik; 22.05.2016 в 14:04.
ivanik вне форума Ответить с цитированием
Старый 22.05.2016, 13:21   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Где же форматирование от ТС? http://programmersforum.ru/showpost....&postcount=236
Для чего это интересно нужно? Самораспаковщики винрара самодостаточны для такого.
Сабж:
Код:
if h4<>0 then sendmessage(h4,BM_CLICK,0,0);
...
//Проверяем присутствие окна подтверждение замены файлов
if findwindow(nil, 'Подтверждение замены файла') = 0 then
А окно может не успеть появиться. Нужно подождать немного. Либо циклом ожидания, либо просто sleep на пару секунд сделать, можно ещё подождать отклика от приложения, ну т.п. способами
И ещё
Код:
if findwindow(nil, 'Подтверждение замены файла') = 0 then
begin
//считываем его дескриптор
h5:=FindWindow(nil, 'Подтверждение замены файла');
что при таком раскладе должно содержаться в h5? Наверное, ноль )). Нужно заменить равенство на неравенство.
Аналогично в
Код:
if findwindow(nil, 'Ввод пароля') = 0 then h7:=FindWindow(nil, 'Ввод пароля');
eoln вне форума Ответить с цитированием
Старый 22.05.2016, 13:43   #3
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Может это Вам подойдёт?
SFX-модули GUI: параметры командной строки
FaTaL вне форума Ответить с цитированием
Старый 22.05.2016, 14:29   #4
ivanik
Пользователь
 
Регистрация: 16.04.2016
Сообщений: 11
По умолчанию EOLN

Здравствуйте!
Спасибо за внимание.
1) Я указал, что хочу программно работать со своим же запароленным архивом, чтобы тот, кто попробует запустить его сам не смог этого сделать.
2) Я не указывал паузы во фрагменте кода. Естественно я пробовал и с ними.
3) Фрагмент кода "if findwindow(nil, 'Самораспаковывающийся архив WinRAR') = 0 then
begin
showmessage ('Окно Самораспаковывающийся архив WinRAR не найдено #32770');"
это для тестового варианта и нужен только для вывода сообщения, что дескриптор не найден, а дальше идет работа по поиску дескриптора
в блоке begin ...end.
Все прекрасно работает. В самой программе код будет по другому.
Мне нужно определить дескриптор окна замены файлов (если потребуется такая замена) и окна ввода пароля (оно выйдет в любом случае).
Теоретически все понятно, практически не получается.
В MS Word и др. окна ввода паролей находятся легко и соответственно вводятся пароли.
Здесь же неполучается, хотя все вроде бы тривиально.
В программе Spy++ все видно (имя элементов и классы), а найти дескрипторы не могу.
Еще раз спасибо всем за внимание. Буду экспериментировать.
ivanik вне форума Ответить с цитированием
Старый 22.05.2016, 14:46   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Может это Вам подойдёт?
SFX-модули GUI: параметры командной строки
имха, вот это подойдёт лучше:

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 22.05.2016, 15:26   #6
ivanik
Пользователь
 
Регистрация: 16.04.2016
Сообщений: 11
По умолчанию min@y

Здравствуйте!
Спасибо за внимание.
Мне нужно конкретно найти дескриптор окна замены файлов и ввода пароля.
Я понял так, что с помощью прилагаемого вами кода можно определить их имена.
Из Spy++ я знаю их имена и классы, но все равно не могу найти их дескрипторы.
Может кто попробует это сделать на Delphi с самораспаковывающимся запароленым архивом с путем распаковки по умолчанию (т.е. на рабочий стол), чтобы сработала кнопка "Да для всех", затем введен пароль и нажата кнопка "ОК".
Мне на это требуется 5 мин., но результат нулевой.
Вам профессионалам это сделать проще.
Если нет Delphi, то можно и на С++, функции, то те же.

Все равно вам спасибо.
ivanik вне форума Ответить с цитированием
Старый 22.05.2016, 15:37   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Мне нужно конкретно найти дескриптор окна замены файлов и ввода пароля.
А может быть тебе надо в итоге просто извлечь файлы из архива?
Вот это читал?
Цитата:
Я понял так, что с помощью прилагаемого вами кода можно определить их имена.
Я разве прилагал какой-то код?

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 22.05.2016 в 15:49.
min@y™ вне форума Ответить с цитированием
Старый 22.05.2016, 17:52   #8
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Хоть и метод добывания нужной добычи странный, но всё-таки отвечу )
1) странный код запуска несуществующего нужно приводить в том виде, в котором вы хотите увидеть невидимое
2) выкинуть проверки нужно, ибо они ещё страннее чем мое утверждение в пункте №1
Код:
begin
  h1 := FindWindow(nil, 'Самораспаковывающийся архив WinRAR');
  h2 := FindWindowEx(h1,0,'ComboBox',nil);
  h3 := FindWindowEx(h2,0,'Edit',nil);
  h4 := FindWindowEx(h1,0,'Button','Извлечь');
  if h4<>0 then postmessage(h4,BM_CLICK,0,0);
  sleep(2000);

  h1 := FindWindow(nil, 'Ввод пароля');
  h2 := FindWindowEx(h1,0,'Edit',nil);
  if h2<>0 then SendMessage(h2, WM_SETTEXT, 0, lparam(pchar('12345')));
  h4 := FindWindowEx(h1,0,'Button','OK');
  if h4<>0 then postmessage(h4,BM_CLICK,0,0);
  sleep(2000);

  h1 := FindWindow(nil, 'Подтверждение замены файла');
  h4 := FindWindowEx(h1,0,'Button','Да для &всех');
  if h4<>0 then postmessage(h4,BM_CLICK,0,0);
end;
eoln вне форума Ответить с цитированием
Старый 22.05.2016, 19:46   #9
ivanik
Пользователь
 
Регистрация: 16.04.2016
Сообщений: 11
По умолчанию OELN

У меня точно такой код в программе.
Единственно, что я вставляю программно путь распаковки.
Может код и странный, но я ведь не профессионал.
А вы чувствуется профессионал и Вам большое СПАСИБО!
Вся причина была в том, что я задавал маленькую паузу (1000 и 500), а когда задал 2000 все заработало как часы.
Вот это я и хотел выяснить.
Чувствую, что все вроде правильно, а не работает.
Ну а не профессионалы пытаются унизить других.
Еще раз Вам большое СПАСИБО!!!
ivanik вне форума Ответить с цитированием
Старый 23.05.2016, 09:50   #10
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию RAR Component

или RAR Component посмотрите:
Вложения
Тип файла: zip RAR Component.zip (115.3 Кб, 10 просмотров)
beegl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эмуляция клика мыши в чужом окне MyIE Win Api 16 06.10.2011 23:26
Нажатие кнопки мыши в чужом окне gufon Общие вопросы Delphi 2 29.06.2011 21:03
TVirtualStringTree в чужом окне. Fairhawk Общие вопросы Delphi 0 27.01.2011 11:54
Drag n Drop объект в чужом окне ShiSha_34 Win Api 8 09.11.2010 02:19
как рисовать текст на чужом окне Crazyman Win Api 5 23.01.2009 00:23