Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с окнами... 
:(
    Опции темы
HiVeR
Дата 25.8.2008, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



в общем, написал прогу, она автоматизирует работу одного приложения, тоесть отлавливает окна и реагирует на них, всё это скрытно, всё бы хорошо, поидее должно работать чётко и качественно, но есть одно но... то приложение, что я автоматизирую делает чтото лишнее или просто чтото скрытое(я не знаю что именно), что сильно влияет на работу всей системы виндоус - активное окно то деактивируется, то снова активируется и всё подглючивает(((
снял видео для наглядности на окне блокнота - http://slil.ru/26086308
на видео я ничего не делаю, всё делает то приложение..., в коде моей проги всё ок, с другими программами всё хорошо, а вот с этой такая муть происходит...
может кто сможет помочь в этом? был бы преочнь благодаренsmile
в голову пришла мысль игнорить процесс, тоесть все окна, все действия от глючащего процесса.. просто не обращать на них внимания, но как тогда будет работать программа...(( и совсем не представляю как такое можно осуществить... может у когонить есть идеи по этому поводу?
если что, то вот часть кода, где создаю процесс:
Код

...
                          GetStartupInfo(StartupInfo);
                          StartUpInfo.dwFlags:=STARTF_USESHOWWINDOW;
                          StartUpInfo.wShowWindow:=SW_HIDE;
                          yes:=CreateProcess(nil,  PChar('1.exe'+' '+mas[i]),
                          nil, nil, FALSE, CREATE_NEW_CONSOLE, nil,
                          Pchar(ExtractFilePath(paramstr(0))), StartupInfo, ProcInfo);
                          if yes then begin
                                      Application.ProcessMessages;
                                      WaitForSingleObject(ProcInfo.hProcess, 20000);
                                      TerminateProcess(ProcInfo.hProcess, NO_ERROR);
                                      end;
...

с окном, после запуска, работает хук из dll...
PM MAIL   Вверх
ama_kid
Дата 25.8.2008, 13:57 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



сейчас тут соберутся телепаты и попробуют угадать, что же ты делаешь в своем хуке и каким образом программа 
Цитата(HiVeR @  25.8.2008,  14:29 Найти цитируемый пост)
автоматизирует работу одного приложения
  smile 


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
HiVeR
Дата 25.8.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



ок, объясню поподробней
запускается процесс с параметром, после появляется окно этого процесса, и окно это перехватывается/проверяется HCBT_ACTIVATE хуком по имени окна, эта часть кода у меня выглядит так:
Код
...
if (code=HCBT_ACTIVATE) then
                        begin
                        Wnd := wParam; //вычисляем его хендл
                        GetWindowText(Wnd, windtext, 255); //читаем Caption окна
                        win:=windtext; //присваиваем win Caption окна
if(win='Caption окна процесса') then действия с окном(вписывание слова в едит приложения и нажатие кнопки ок)
...

даже если не использовать мою прогу, просто запускать то самое приложение и делать всё руками, то есть небольшой скачок - винда подглючивает, "верхнее" окно то активно то неактивно, но это длиться 1-2 секунды, а моя прога это делает в цикле и достаточно быстро, потому винда просто начинает жестоко глючить... и что с этим - делать я ваще беспонятия(((
вот, надеюсь более понятно объяснил
PM MAIL   Вверх
ama_kid
Дата 25.8.2008, 19:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



на самом деле, было бы понятней, если бы ты прикрепил максимально обрезанный исходник, где наблюдается проблема.  smile 
Цитата(HiVeR @  25.8.2008,  16:15 Найти цитируемый пост)
действия с окном(вписывание слова в едит приложения и нажатие кнопки ок)
вот на эти действия подозрение падает в первую очередь...
Цитата(HiVeR @  25.8.2008,  16:15 Найти цитируемый пост)
даже если не использовать мою прогу, просто запускать то самое приложение и делать всё руками, то есть небольшой скачок - винда подглючивает, "верхнее" окно то активно то неактивно, но это длиться 1-2 секунды
Есть подозрение, что при нажатии на кнопку в этом приложении осуществляется какая-то работа по активизации окна (к примеру, есть такой финт по выводу окна на Foreground - минимизация и максимизация без анимации). Тогда твой хук может  активироваться в бесконечном цикле. Если есть возможность - попробуй отлавливать не HCBT_ACTIVATE, а к примеру HCBT_CREATEWND или что-то другое - будет ли наблюдаться подобная проблема?... Если нужно именно HCBT_ACTIVATE - тогда надо смотреть\оптимизировать конкретно код.



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
HiVeR
Дата 25.8.2008, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Цитата

на самом деле, было бы понятней, если бы ты прикрепил максимально обрезанный исходник, где наблюдается проблема. 

знать бы где проблема, попозже если что выложу
Цитата

вот на эти действия подозрение падает в первую очередь...

вот как это у меня в коде, вроде всё верно)
Код

...else if(win='<caption окна>') then
 Begin
 ShowWindow(Wnd, SW_HIDE);
 h1:=FindWindow(nil, PChar(win)); // находим хендл окна
 h2:=FindWindowEx(h1, 0, 'Edit', '');
 h2:=FindWindowEx(h1, h2, 'Edit', ''); // находим хендл нужного edit'a
 h3:=FindWindowEx(h1, 0, 'Button', 'OK'); // находим хендл кнопки ОК
 SendMessage(h2, WM_SETTEXT, 255, integer(str)); // записываем в едит текст
 SendMessage(h3, BM_CLICK, 0, 0); // жмём кнопку ок
SaveToFile('log.txt','['+FormatDateTime('dd/mm/yyyy hh:nn:ss', Date+Time) +'] '+text, true);...
Цитата


Есть подозрение, что при нажатии на кнопку в этом приложении осуществляется какая-то работа по активизации окна (к примеру, есть такой финт по выводу окна на Foreground - минимизация и максимизация без анимации). Тогда твой хук может  активироваться в бесконечном цикле.

наблюдал такой факт - некоторые окна(всего перехватываю 6 окон), судя по логу, появляются несколько раз, хотя должны поидее лишь один... в логе постоянно записи "в двойном кол-ве", 2 окна перехватываются норм, а остальные 4 якобы дважды, странно...
Цитата

Если есть возможность - попробуй отлавливать не HCBT_ACTIVATE, а к примеру HCBT_CREATEWND или что-то другое - будет ли наблюдаться подобная проблема?... Если нужно именно HCBT_ACTIVATE - тогда надо смотреть\оптимизировать конкретно код.

попробую, а вообще мне кажется что дело в самом приложении и от моей проги тут ничего не зависит, но не уверен, буду пробовать)
спасибо за ответыsmile

Это сообщение отредактировал(а) HiVeR - 25.8.2008, 22:54
PM MAIL   Вверх
Virtuals
Дата 26.8.2008, 13:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



а самый главный вопрос, зачем все это?

ну а если так сильно хочется управлять чужим приложением, да еще и скрытно, (зачем же тогда хиде) то

1. окно с параметром SW_HIDE, не совсем полноценное окно!, особо если программист контролирует состояние окна, ну такое как скрытие и минимизация... отсюда не лучше ли просто окна "пихать" за пределы экрана (эллементарно сменив координаты положения окна), чем скрывать их?
2. ну и на самый крайний случай можно вообще загнать в другой рабочий стол smile (одно но если приложение взаимодействует с оболочкой, возможны небольшие глюки )
PM MAIL ICQ   Вверх
HiVeR
Дата 27.8.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Цитата

а самый главный вопрос, зачем все это?

программа должна работать корректно и прога это очень важна для меня
Цитата

окно с параметром SW_HIDE, не совсем полноценное окно!, особо если программист контролирует состояние окна, ну такое как скрытие и минимизация... отсюда не лучше ли просто окна "пихать" за пределы экрана (эллементарно сменив координаты положения окна), чем скрывать их?

возможно пихать их куда подальше это хорошо), но проблема не решилась...

нашёл в чём дело, всё дело в
Цитата(ama_kid @  25.8.2008,  19:43 Найти цитируемый пост)
финт по выводу окна на Foreground - минимизация и максимизация без анимации

отсюда всё сразу становится ясно:
1. 
Цитата

наблюдал такой факт - некоторые окна(всего перехватываю 6 окон), судя по логу, появляются несколько раз, хотя должны поидее лишь один... в логе постоянно записи "в двойном кол-ве", 2 окна перехватываются норм, а остальные 4 якобы дважды, странно...
изза этого финта окно активируется дважды, после максимизации окна - оно сново активно и потому записи в логе в двойном кол-ве!
2. пробовал при создании процесса окно сувать на задний план и не позволял ему брать фокус, делал так:
Код

GetStartupInfo(StartupInfo);
StartUpInfo.wShowWindow:=SW_SHOWNOACTIVE;
yes:=CreateProcess(nil,  PChar('notepad.exe'),
nil, nil, FALSE, CREATE_NEW_CONSOLE, nil,
Pchar(ExtractFilePath(paramstr(0))), StartupInfo, ProcInfo);


с блокнотом всё ок, встаёт на задний план и никому не мешает, а если заменить 'notepad.exe' на мой процесс, то на всё просто пофиг, окно проца сразу становиться активным...(
вопрос в том, как убрать/предотвратить или сделать "невлияющим" тот финт с минимизацией и максимизацией окна?
PM MAIL   Вверх
Virtuals
Дата 27.8.2008, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



Цитата

возможно пихать их куда подальше это хорошо), но проблема не решилась...

я имел ввиду что просто перехватывать момент отображения окна и задавать ему размеры за экраном
Код

SetWindowPos(wn,HWND_BOTTOM,Screen.DesktopWidth,1,20,20,SWP_nosize);


и все дальше спокойно с ним работать, и глаза не мозолит и не трогаем функционал окна smile 
PM MAIL ICQ   Вверх
HiVeR
Дата 30.8.2008, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Virtuals, не помогло:(, проблема не с замозоливанием глаз, а с тем что процесс мешает работе виндоус, окна того процесса, что я перехватываю, получают фокус и активируются не смотря ни на что, я пробовал и hide и SetWindowPos - нифига, окна этого процесса ведут себя как хотят...
повторюсь, скорее всего это связано с 
Цитата

к примеру, есть такой финт по выводу окна на Foreground - минимизация и максимизация без анимации.

но что с этим делать я беспонятия, HCBT_CreateWND не могу использовать, т.к он работает со всем иначе и работает не так как хотелось бы, в общем он глючит... наверное можно поставить ещё один хук - на минимизацию/максимизацию окна, но не думаю что это есть хорошо...
ama_kid, мож ты знаешь как нужно оптимизировать код, чтобы всё ок было? если нужно выложу весь урезанный до максимума код, но сомневаюсь, что он поможет...
сори что поздно ответил
PM MAIL   Вверх
Virtuals
Дата 31.8.2008, 11:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



HiVeR, ну у тебя однозначно проблемы в логике перехвата, а может плюнуть на все эти хуки и тупо свалить в другой стол вместе с процессом управления?
имхо самый надежный способ, и ничего прятать и пререхватывать не нужно
 smile 

Код

CreateDesktop
CreateProcess управляющий
CreateProcess жертва


ну и SwitchDesktop если захочеш позырить как там дела smile 

ЗЫЗЫ вещь абалденная, но как ни странно мало кто про нее помнит
PM MAIL ICQ   Вверх
HiVeR
Дата 31.8.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 30.6.2008

Репутация: нет
Всего: нет



Virtuals, идея куль! smile 
но вот перехватывать всё равно нужно(, надо же как то реагировать на появляющиеся окна, хотя мож я недопонял малёк), и всё таки, перехваты будут на другом рабочем столе?
объясни плиз поподробнее про создание второго стола и просто, что он из себя представляет?..или мож есть что почитать, чтото гугл не кишит информацией(
Цитата

ЗЫЗЫ вещь абалденная, но как ни странно мало кто про нее помнит
дк про неё наверное совсем мало кто слышал, взять к примеру тот же гугл... спс за эту вещь), ещё как пригодица потом)

Это сообщение отредактировал(а) HiVeR - 31.8.2008, 16:57
PM MAIL   Вверх
Virtuals
Дата 1.9.2008, 06:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



HiVeR, 
ну если упрощенно то
винда > терминальные сессии > множество оконных станций (WindowStation) > множество столов (Desktop) (все это на НТ платформе)

пример использования:
в винде где жмеш цтрл алт дел и логин пароль это стол с именем Winlogon а вот где юзер обычно живет это уже Default
все именно в целях изоляции и безопасности!

оконные хуки работают именно в пределах стола!
я так консольный сервак контры запускал
он периодически вылетал с ав вот и ловил окошко и жал Ок, после перезапускал smile 

ЗЫ смотри личку, код здесь выкладывать не буду по политическим соображениям, иначе придется боротся с новым классом вирусов имхо
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0530 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.