Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Внизкак получить handle контрола на чужей форме Найти похожие ветки
← →
Mell (2004-07-21 13:54) [0]как получить handle контрола на чужей форме
← →
pasha_golub © (2004-07-21 14:01) [1]FindWindow или EnumWindows
← →
VMcL © (2004-07-21 14:09) [2]>>pasha_golub © (21.07.04 14:01) [1]
Контрола? Тогда наверное + FindWindowEx и иже с ним.
← →
Mell (2004-07-21 14:10) [3]А пример можеш дать?handle формы я знаю , мне нужно найти на форме richedit или edit, ит...
← →
pasha_golub © (2004-07-21 14:14) [4]VMcL © (21.07.04 14:09) [2]
Согласен.
EnumChildWindows + GetWindow с параметро GW_CHILD
← →
Mell (2004-07-21 14:23) [5]ну блин вы мне пример дайте
← →
Внук © (2004-07-21 14:26) [6]И побольше, побольше :))
← →
Rouse_ © (2004-07-21 14:28) [7]хм...
////////////////////////////////////////////////////////////////////////////////
//
// Автор: Александр (Rouse_) Багель
// © Fangorn Wizards Lab 1998 - 2002
// 16 октября 2002 18:21
// Данный код приведен лишь для демонстрации
// А простой вариант поиска Handle Ричедита выглядит так
// var
// Handle : HWND;
// begin
// Handle:= FindWindowEx(FindWindow(Название формы например "Form1",nil), 0, Название элемента например "Button1", nil), 0, true);
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls;
type
TMainForm = class(TForm)
TreeView1: TTreeView;
procedure FormCreate(Sender: TObject);
procedure Sys_Windows_Tree(Node: TTreeNode; Handle: HWND);
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
////////////////////////////////////////////////////////////////////////////////
//
// Стартовая функция, запускаем рекуссию используя хэндл рабочего стола
//
procedure TMainForm.FormCreate(Sender: TObject);
var
StartHandle : THandle;
begin
//Если требуется найти только данные по одному приложению
//замени 2 строки в функциях их закоментированными аналогами
StartHandle := GetDeskTopWindow;
//StartHandle := 67324;//FindWindow(PChar(Caption), nil); //На примере Винампа
Sys_Windows_Tree(nil, StartHandle);
end;
////////////////////////////////////////////////////////////////////////////////
//
// Рекурсивная функция, строит дерево всех открытых окон, кнопок, едитов и т.д.
// В качестве входных данных получает узел дерева и Хэндл окна
//
procedure TMainForm.Sys_Windows_Tree(Node: TTreeNode; Handle: HWND);
const
MAX = 128;
var
TmpArray : array[0..MAX - 1] of Char;
Result : String;
begin
//Запускаем цикл пока не закончатся окна
while Handle <> 0 do
begin
//Получаем имя класса окна
GetClassName(Handle, @TmpArray, MAX);
Result := String(TmpArray);
//Получаем текст (Его Caption) окна
GetWindowText(Handle, @TmpArray, MAX);
Result := Result + "(" + String(TmpArray) +
"): Handle = "+ IntToStr(Handle);
//В следующей процедуре, в скобках, добавляем результат
//в дерево, получаем хэндл дочернего окна и с результатами
//выполнения этих двух функций выполняем процедуру Sys_Windows_Tree
Sys_Windows_Tree(TreeView1.Items.AddChild(Node, Result),
GetWindow(Handle, GW_CHILD));
//Получаем хэндл следующего (не дочернего) окна
Handle := GetNextWindow(Handle, GW_HWNDNEXT);
//Handle := 0;
end;
end;
end.
← →
Mell (2004-07-21 14:45) [8]>>Rouse_
Чмок!!1
← →
Mell (2004-07-21 15:36) [9]и еще вопрос как скопировать текст с чужего ричедита
← →
Rouse_ © (2004-07-21 15:50) [10]SendMessage + EM_SETSEL + WM_COPY
← →
Mell (2004-07-21 16:27) [11]а как найти контрол который имеет фокус?
← →
Юрий Зотов © (2004-07-21 16:49) [12]GetWindowThreadProcessID + AttachThreadInput + GetFocus
Примеры см. в MSDN
← →
Mell (2004-07-22 10:00) [13]е где взять msdn?
← →
Rouse_ © (2004-07-22 10:23) [14]Блин :)
http://msdn.microsoft.com/
http://search.microsoft.com/search/search.aspx?View=msdn
← →
Mell (2004-07-22 11:43) [15]
procedure TForm1.Timer1Timer(Sender: TObject);
var
t:array[0..255] of char;
begin
if windows.AttachThreadInput(getwindowthreadprocessid(getforegroundwindow),getcurrentthreadid,true) then
begin
getwindowtext(getfocus,t,sizeof(t));
memo1.Text:=t;
end;
end;
Что неверно почему не пашет?
← →
VMcL © (2004-07-22 11:51) [16]>>Mell (22.07.04 11:43) [15]
>Что неверно почему не пашет?
1. Пашет колхозник в поле.
2. Что именно не работает, наверное, нужно угадать.
3. Что ж, попробуем угадать: почему у getwindowthreadprocessid один параметр?
← →
Mell © (2004-07-22 11:56) [17]В Делфи7 один второй по умолчанию = nil
компилятор не ругается
я спрашиваю почему текст не копируется в мемо
← →
VMcL © (2004-07-22 12:01) [18]>>Mell © (22.07.04 11:56) [17]
>я спрашиваю почему текст не копируется в мемо
getwindowtext - это функция.
← →
ЮрийК © (2004-07-22 12:04) [19]getwindowtext наверное должен получить window caption, а у данного контрола его типа нет.
SendMessage(...SelText...{типа селектировать текст}...)
SendMessage(...CopyText...)
Смотрите в Хелпах SendMessage и передаваемые константы в функцию для селектирования и копирования текста.
← →
Rouse_ © (2004-07-22 12:09) [20]хм...
procedure TForm1.Timer1Timer(Sender: TObject);
var
Buff: array[0..255] of Char;
ForegrowndWindow, WindowProcessID: HWND;
begin
ForegrowndWindow := GetForegroundWindow;
WindowProcessID := GetWindowThreadProcessId(ForegrowndWindow);
if AttachThreadInput(WindowProcessID, GetCurrentThreadId, True) then
begin
FillChar(Buff, SizeOf(Buff), #0);
SendMessage(GetFocus, WM_GETTEXT, SizeOf(Buff), Integer(@Buff));
Memo1.Lines.Add(String(Buff));
end;
end;
← →
Rouse_ © (2004-07-22 12:10) [21]Для проверки сделай Пуск-выполнить и набирай там текст...
← →
Mell © (2004-07-22 12:11) [22]а почему тогда она работает на richedit? и button если не вызывать AttachThreadInput?
← →
Rouse_ © (2004-07-22 12:26) [23]> [22] Mell © (22.07.04 12:11)
Которые у тебя же в программе находятся?
Если да то почитай хелп по GetFocus
По поводу копирования текста вот тебе еще одна выдержка...For an edit control, the text to be copied is the content of the edit control. For a combo box, the text is the content of the edit control (or static-text) portion of the combo box. For a button, the text is the button name. For other windows, the text is the window title. To copy the text of an item in a list box, an application can use the LB_GETTEXT message.
When the WM_GETTEXT message is sent to a static control with the SS_ICON style, the handle of the icon will be returned in the first four bytes of the buffer pointed to by lpszText. This is true only if the WM_SETTEXT message has been used to set the icon.
In a rich edit control, if the text to be copied exceeds 64K, use either the message EM_STREAMOUT or EM_GETSELTEXT.
← →
Digitman © (2004-07-22 12:27) [24]ДГДЛ
← →
Mell © (2004-07-22 12:29) [25]to Rouse_ блин если текст больше 255 символов то ничего не пашет!!!!!Help me
← →
Digitman © (2004-07-22 12:32) [26]
> ничего не пашет
см. VMcL © (22.07.04 11:51) [16] , п.1
> если текст больше 255 символов
значит и буфер приема t следует увеличить так чтобы "хватало"
← →
Mell © (2004-07-22 12:38) [27]а как я могу угадать сколько текста там будет???
← →
Digitman © (2004-07-22 12:45) [28]
> как я могу угадать сколько текста там будет
гадают шаманы ... с бубном ..
программисты же, когда им дают подсказку, бегом дуют в справку и обнаруживают там, что для "гадания" есть еще ф-ция getwindowtextlength
← →
Mell © (2004-07-22 13:07) [29]и как я массиву могу новую длину задать?
← →
Mell © (2004-07-22 13:22) [30]Урррррра!!!!!!!!!!!!!!!!!!!!!!!!!!
← →
Digitman © (2004-07-22 13:23) [31]
> Mell © (22.07.04 13:22) [30]
> Урррррра!!!!!!!!!!!!!!!!!!!!!!!!!!
угу ... ура, наша бабушка - самец
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.037 c