Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Завтра :

День славянской письменности и культуры


Поиск элементов на форме.


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Пол:Муж alphons
Новичок




Зарегистрирован: 06.05.2007
Сообщения: 21

СообщениеСр, 08-Авг-2007 0:30    Заголовок сообщения: Поиск элементов на форме.
Цитата

Драсте. Подскажите как найти форму и все к примеру кнопки на ней имея только хендл процесса,
или скиньте пару ссылок где можно об этом узнать.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Stilet
Новичок


Возраст: 28
Знак зодиака: Рыбы
Зарегистрирован: 01.08.2007
Сообщения: 3
Откуда: Украина, Донецкая обл. г.Краматорск
СообщениеСр, 08-Авг-2007 7:50 
Цитата

EnumThreadWindows Даст тебе окна того процесса, а дальше EnumChildWindows даст уже тебе окна на форме, среди них должны быть кнопки. Их можно выделить проверив класс через GetClassName.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж alphons
Новичок




Зарегистрирован: 06.05.2007
Сообщения: 21

СообщениеСр, 08-Авг-2007 16:40 
Цитата

Я почитал инфы и всё бестолку у EnumThreadWindows 3 параметра:1 указатель на поток, 2 указатель на загадочную функцию, 3 размер загадочной функции. это так?
Если так, то где взять-то эту функцию. Плиз опишы по подробней, либо отправь мну на какой-нибудь сайтик правельный.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Шурик
Я живу тут....


Возраст: 42
Знак зодиака: Овен
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
СообщениеСр, 08-Авг-2007 19:04 
Цитата

Второй параметр -- callback функция. Ты пишешь у себя функцию с определёнными параметрами и даёшь её адрес при вызове API функции EnumThreadWindows. После этого API функция проходится по своему списку и вызывает твою функцию для каждого элемента списка. Описание callback параметров функции ищи в ссылках к описанию EnumThreadWindows:
Код:
BOOL CALLBACK EnumThreadWndProc
(
    HWND hwnd,      // handle to window
    LPARAM lParam    // application-defined value
);


Вторым параметром calback функции даётся число, которое ты передашь третим параметром в EnumThreadWindows. Ещё не запутался? Жалобы -- в микрософт.

Этот параметр нужен на случай, когда у тебя одна callback функция должна использоваться в разных вариациях. Чтобы не писать на каждый случай свою callback функцию используют одну, но указывают ей какой-то код, разный для каждого варианта. Для твоего случая там можно смело писать 0 и не думать ни о чём.

Механизм callback функций встречается во многих API функциях, которые должны выдавать какие-то списки.

Добавлено спустя 19 минут 24 секунды:

Что за приложение, в котором ты ищешь?
Для поиска в текущем (Дельфийском) процессе есть функция FindControl (unit Controls). Посмотри её исходник, может сможешь переделать и на "чужой" процесс. Также рядом с ней в исходниках есть ObjectFromHWnd, которая делает то же, но чуть другим способом.

delphi:
  1. function ObjectFromHWnd(Handle: HWnd): TWinControl;
  2. var OwningProcess: DWORD;
  3. begin
  4.   if (GetWindowThreadProcessID(Handle, OwningProcess) <> 0) and
  5.      (OwningProcess = GetCurrentProcessID) then
  6.     Result := Pointer(SendMessage(Handle, RM_GetObjectInstance, 0, 0))
  7.   else
  8.     Result := nil;
  9. end;
  10.  
  11. function FindControl(Handle: HWnd): TWinControl;
  12. var OwningProcess: DWORD;
  13. begin
  14.   Result := nil;
  15.   if (Handle <> 0) and (GetWindowThreadProcessID(Handle, OwningProcess) <> 0) and
  16.      (OwningProcess = GetCurrentProcessId) then
  17.   begin
  18.     if GlobalFindAtom(PChar(ControlAtomString)) = ControlAtom then
  19.       Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)))
  20.     else
  21.       Result := ObjectFromHWnd(Handle);
  22.   end;
  23. end;


Добавлено спустя 2 минуты 3 секунды:

...Если "чужой" процесс "не Дельфийский" -- тогда только через API, хэндлы, callback-и

_________________
Ответ готов, готов ли твой вопрос?
В начало
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Пол:Муж alphons
Новичок




Зарегистрирован: 06.05.2007
Сообщения: 21

СообщениеЧт, 09-Авг-2007 15:52 
Цитата

Спасибо разобрался. только опять загвоздочка вышла. получаю хендлы всех окон и пробую прочитать их заголовок:

var buf:pchar;
s:string;
begin
getwindowtext(hwnd,buf,sizeof(buf));
s:=strpas(buf);
end;

почему-то функция возврашяет пустое значение. подскажите плиз в чем дело.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Шурик
Я живу тут....


Возраст: 42
Знак зодиака: Овен
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
СообщениеЧт, 09-Авг-2007 15:58 
Цитата

delphi:
  1. const buf_size=50;
  2. var s:string;
  3. begin
  4.   SetLength( s, buf_size );
  5.   GetWindowText( hwnd, PChar(s), buf_size );
  6.   ...
  7. end


Добавлено спустя 3 минуты 40 секунд:

В твоём варианте:
buf -- это указатель "в никуда"
sizeof(buf) = 4 -- размер указателя
В лучшем случае тебе писали 4 байта непонятно куда. По идее ты должен был их увидеть.
Буфер выделять должен ты, а не функция. Возможно, она не пишет ничего, если буфер маленький.

_________________
Ответ готов, готов ли твой вопрос?
В начало
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100