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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2010, 15:15   #1
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию Работа с чужими окнами

Здравствуйте, сори за подобную тему, знаю, что подобных тем много, но прочитав их - я не смог найти ответов на несколько вопросов (может просмотрел или не понял что именно нужно), вобщем вот:
Для начала, можно ли как-нибуть через:
Код:
PostMessage(wnd, WM_KEYDOWN, key, 0);
PostMessage(wnd, WM_KEYUP, key, 0);
Имитировать нажатие -> ':' в неактивное окно?
вот так
Код:
PostMessage(wnd, WM_KEYDOWN, VK_SHIFT, 0);
PostMessage(wnd, WM_KEYDOWN, 186, 0);
PostMessage(wnd, WM_KEYUP, 186, 0);
PostMessage(wnd, WM_KEYUP, VK_SHIFT, 0);
или так
Код:
keybd_event(16,0,0,0);
PostMessage(wnd, WM_KEYDOWN, 186, 0);
PostMessage(wnd, WM_KEYUP, 186, 0);
keybd_event(16,0,KEYEVENTF_KEYUP,0 );
Не катит, он печатает не ':' а ';' хз почему так.
Через WM_CHAR тоже не получается, т.к. не удается узнать класс и т.д. поля ввода (оно появляется в приложении по нажатию на Enter).
В блокноте например никаких проблем и Edit опредилить получилось и через Char посылать сообщения, а тут ток через нажатие получается..

И как можно изменить заголовок чужого окна?
Дело в том, что запускаются 2 копии программы, но данные надо вводить допустим только во вторую копию программы.
Но если в момент определения окна по классу(потому что заголовок динамичный, по классу легче было сделать) - активным окном будет первая копия программы, то данные в дальнейшем будут вводиться именно в нее, а не в ту, что нужно.

Зарание спасибо.
ZBEP вне форума Ответить с цитированием
Старый 15.01.2010, 15:25   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

PostMessage(wnd, $0102, ord(':'), 0) ...wnd должно-быть именно окно которому посылаете.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 15.01.2010, 15:42   #3
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

А вот косяк в том, что оно не известно.
Известно главное окно, на котором (помойму с помошью скрипта реализован ввод по нажатию на Enter).
Если так, то он посылает команду главному окну, а не в поле ввода.

Получилось только имитировать нажатие на Enter и затем вводить данные:
Код:
procedure CK(wnd: HWND; kk:string);
var n:integer;
begin

if kk='a' then n:=65;     //Присваиваю коды клавишь.
...
if kk='/' then n:=191;

if wnd<>0 then           //Если окно найдено, то выполняется условие
begin
PostMessage(wnd, WM_KEYDOWN, n, 0);   //Зажать кнопку
PostMessage(wnd, WM_KEYUP, n, 0);        //Отпустить кнопку
end;
end;
...
...

procedure ClickKey(wnd: HWND; key:word);
begin
if wnd<>0 then
begin
PostMessage(wnd, WM_KEYDOWN, key, 0);
PostMessage(wnd, WM_KEYUP, key, 0);
end;
end;

...
...

procedure TForm1.Button1Click(Sender: TObject);
var wnd: HWND; i,n: Integer;
s:string;
begin
wnd:=FindWindow('SDL_app', nil);         //ищу окно по классу
sleep(500);                                       //Жду..
ClickKey(wnd,13);                              //Нажимаю Enter
s:='Вводимые данные';                       //Пишу нужные команды
for i := 1 to Length(s) do  //Посылаю буквы поочереди                  
CK(wnd,s[i]);                 //в процидуру CK 
sleep(500);
ClickKey(wnd,13);
end;
Но ':' в неактивном окне ввести не получилось, приходится делать окно активным и затем:
Код:
keybd_event(16,0,0,0);
keybd_event(186,0,0,0);
keybd_event(186,0,KEYEVENTF_KEYUP,0 );
keybd_event(16,0,KEYEVENTF_KEYUP,0 );
Но нужно это делать в неактивном окне(

Последний раз редактировалось ZBEP; 15.01.2010 в 15:52.
ZBEP вне форума Ответить с цитированием
Старый 15.01.2010, 16:05   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
А вот косяк в том, что оно не известно...
значит его сначала найти нужно через EnumChildWindows... берем справочник dFaq от mihali4 и ищем...
Код:
var Edits: array of HWND;

function EnumEdits(H:HWND;i:integer):BOOL;stdcall;
var s:string;
begin
 Result:=true;
 setLength(s,256)
 GetClassName(H,PChar(s),255);
 SetLength(s,lStrLen(PChar(s)));
 if ANSIApperCase(s)<>'EDIT' then exit;
 SetLength(Edits,Length(Edits)+1);
 Edits[Length(Edits)]-1:=H;
end;


 //по кнопке например
 SetLength(Edits,0);
 EnumChildWindows(findwindow(nil,'MU'),{ìîæåò @ íàäî}EnumEdits,0);
 //в массиве Edits все EDIT контролы родителями которого является окно MU
смысл ясен?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 15.01.2010, 16:20   #5
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

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

Последний раз редактировалось ZBEP; 15.01.2010 в 16:29.
ZBEP вне форума Ответить с цитированием
Старый 15.01.2010, 16:49   #6
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Не, ненаходит(
Или я что-то не так делаю..
C FindWindowEx тож попробовал..

Могу сказать приложение и ссылку дать откуда скачать можно (метров 8 весит, игра, я что-то вроде бота пишу).
У меня чет никак не выходит..

П.с.
А насчет исменения заголовка где можно покопать?
гуугл выдает оч много и не по теме..
Хотя может я туплю..

Последний раз редактировалось ZBEP; 15.01.2010 в 16:54.
ZBEP вне форума Ответить с цитированием
Старый 15.01.2010, 18:35   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

raxp, чтото код до боли знакомый(особенно с моей привычкой к пробелам и отступам)

ТС, ну скиньте.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.01.2010, 19:00   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

он самый, он самый
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 15.01.2010, 19:03   #9
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Игра - Toribash
Скачать можно с официального сайта http://www.toribash.com/downloads.php
Необходимо определить поле воода которое появляется при нажатии на Enter во время игры (типа чат).

П.с.
Изменение заголовка - тоже нужно, или как еще можно разделить 2 запускаемые копии этой игры?

Последний раз редактировалось ZBEP; 15.01.2010 в 19:20.
ZBEP вне форума Ответить с цитированием
Старый 15.01.2010, 20:55   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)там нет внутренних окон, все рисуется на главном...значит шлем все ему.

2)по PID например.(+помнить какое окно какому процессу принадлежит)
а перечислить все окна можно по коду что raxp дал(чуть переделать надо)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с чужими окнами Djem1991 Общие вопросы Delphi 3 15.11.2009 22:35
работа с чужими окнами betirsolt Общие вопросы Delphi 8 06.10.2009 12:52
работа с чужими программами Rend1 Win Api 31 02.03.2008 16:42
работа с окнами Briz Общие вопросы Delphi 5 07.10.2007 22:20
работа с "чужими" окнами zetrix Безопасность, Шифрование 1 29.10.2006 11:28