| Автор
| Сообщение |
 alphons
Новичок

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

Возраст: 28
Знак зодиака: 
Зарегистрирован: 01.08.2007
Сообщения: 3
Откуда: Украина, Донецкая обл. г.Краматорск
|
|
|
Цитата |
|
| EnumThreadWindows Даст тебе окна того процесса, а дальше EnumChildWindows даст уже тебе окна на форме, среди них должны быть кнопки. Их можно выделить проверив класс через GetClassName. |
|
| В начало |
|
 |
 alphons
Новичок

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

Возраст: 42
Знак зодиака: 
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
|
|
|
Цитата |
|
Второй параметр -- 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: | function ObjectFromHWnd(Handle: HWnd): TWinControl; var OwningProcess: DWORD; begin if (GetWindowThreadProcessID(Handle, OwningProcess) <> 0) and (OwningProcess = GetCurrentProcessID) then Result := Pointer(SendMessage(Handle, RM_GetObjectInstance, 0, 0)) else Result := nil; end; function FindControl(Handle: HWnd): TWinControl; var OwningProcess: DWORD; begin Result := nil; if (Handle <> 0) and (GetWindowThreadProcessID(Handle, OwningProcess) <> 0) and (OwningProcess = GetCurrentProcessId) then begin if GlobalFindAtom(PChar(ControlAtomString)) = ControlAtom then Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom))) else Result := ObjectFromHWnd(Handle); end; end;
|
Добавлено спустя 2 минуты 3 секунды:
...Если "чужой" процесс "не Дельфийский" -- тогда только через API, хэндлы, callback-и _________________ Ответ готов, готов ли твой вопрос? |
|
| В начало |
|
 |
 alphons
Новичок

Зарегистрирован: 06.05.2007
Сообщения: 21
|
|
|
Цитата |
|
Спасибо разобрался. только опять загвоздочка вышла. получаю хендлы всех окон и пробую прочитать их заголовок:
var buf:pchar;
s:string;
begin
getwindowtext(hwnd,buf,sizeof(buf));
s:=strpas(buf);
end;
почему-то функция возврашяет пустое значение. подскажите плиз в чем дело. |
|
| В начало |
|
 |
 Шурик
Я живу тут....

Возраст: 42
Знак зодиака: 
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
|
|
|
Цитата |
|
| delphi: | const buf_size=50; var s:string; begin SetLength( s, buf_size ); GetWindowText( hwnd, PChar(s), buf_size ); ... end;
|
Добавлено спустя 3 минуты 40 секунд:
В твоём варианте:
buf -- это указатель "в никуда"
sizeof(buf) = 4 -- размер указателя
В лучшем случае тебе писали 4 байта непонятно куда. По идее ты должен был их увидеть.
Буфер выделять должен ты, а не функция. Возможно, она не пишет ничего, если буфер маленький. _________________ Ответ готов, готов ли твой вопрос? |
|
| В начало |
|
 |
|