Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1090780772
sdw_syscoder
2004-07-25 22:39
2004.08.08
Intel HEX File и операции над HEX-данными.


3-1089703549
Orac
2004-07-13 11:25
2004.08.08
Переход на сетевые БД


6-1086354999
Viland
2004-06-04 17:16
2004.08.08
Глюк с TClientSocket


1-1090446991
Volk
2004-07-22 01:56
2004.08.08
Файл


3-1089710228
Джон
2004-07-13 13:17
2004.08.08
INSERT записи из текстового файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский