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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2011, 17:45   #1
Lorden
Форумчанин
 
Регистрация: 11.08.2008
Сообщений: 139
По умолчанию Получения Handle компонентов программы

Добрый день! подскажите как получить хендл кнопки Button имеющей например заголовок:
Код:
Открыть текс для его 
последующего преобразования
использую код:
Код:
var
Handle1, Handle2: integer;
begin
  Handle1 := 0;
  Handle2 := 0;
  while  Handle1 = 0 do
    begin
      Handle1 := FindWindow(nil, 'VCL');
   Label1.Caption:=IntTOStr(Handle1);
    end;
  Handle2 := FindWindowEx(Handle1, 0, nil, 'Открыть текс для его 
последующего преобразования');
  Label2.Caption:=IntTOStr(Handle2);
Но Handle2 равен 0, как я понимаю не правельно введено имя кнопки "Открыть текс для его последующего преобразования" т.к. в программе она имеет вид:
Код:
Открыть текс для его 
последующего преобразования
но я чёт не пойму как сделать такой переход в программе? если сделать так:
Код:
Handle2 := FindWindowEx(Handle1, 0, nil, 'Открыть текс для его'+#13#10+'последующего преобразования');
но так не работает.
На форме также имеется кнопка "Открыть" и при выполнении такого кода:
Код:
var
Handle1, Handle2: integer;
begin
  Handle1 := 0;
  Handle2 := 0;
  while  Handle1 = 0 do
    begin
      Handle1 := FindWindow(nil, 'VCL');
   Label1.Caption:=IntTOStr(Handle1);
    end;
  Handle2 := FindWindowEx(Handle1, 0, nil, 'Открыть');
  Label2.Caption:=IntTOStr(Handle2);
в Handle2 заносится всё корректно.
Если ктонить понял что я хочу подскажите пожалуйста=)

Последний раз редактировалось Lorden; 03.03.2011 в 17:47.
Lorden вне форума Ответить с цитированием
Старый 03.03.2011, 17:58   #2
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

попробуите так
Код:
  FindWindowEx(Handle1, Handle2, nil, 'Открыть текс для его последующего преобразования');
  Label2.Caption:=IntTOStr(Handle2);
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 03.03.2011, 18:04   #3
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Пиши вместо
+#13#10+
просто
+#13+
Будет работать.
_SERGEYX_ вне форума Ответить с цитированием
Старый 03.03.2011, 20:19   #4
Lorden
Форумчанин
 
Регистрация: 11.08.2008
Сообщений: 139
По умолчанию

не то не другое не работает( кто-то говорил что загловок компанента можно вытащить через WinSight32 но там не отображается почемуто...
Вот нашёл код который определяет Handle и класс компонента на форме:
Код:
procedure TForm1.Timer1Timer(Sender: TObject); 
var 
  rPos: TPoint; 
begin 
  if Boolean(GetCursorPos(rPos)) then ShowHwndAndClassName(rPos);
end; 

procedure TForm1.ShowHwndAndClassName(CrPos: TPoint);
var 
  hWnd: THandle; 
  aName: array [0..255] of Char; 
begin 
  hWnd := WindowFromPoint(CrPos);
  Label1.Caption := 'Handle :  ' + IntToStr(hWnd);
  if Boolean(GetClassName(hWnd, aName, 256)) then
    Label2.Caption := 'ClassName :  ' + string(aName) 
  else
    Label2.Caption := 'ClassName :  not found';
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
  Form1.FormStyle := fsStayOnTop; 
  Timer1.Interval := 50; 
end;
а можно ли чтобы место класса показывало Caption компонента?

Последний раз редактировалось Lorden; 03.03.2011 в 21:38.
Lorden вне форума Ответить с цитированием
Старый 04.03.2011, 11:26   #5
Lorden
Форумчанин
 
Регистрация: 11.08.2008
Сообщений: 139
По умолчанию

или можно вытащить Name компонентак канить?
Lorden вне форума Ответить с цитированием
Старый 04.03.2011, 12:54   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

GetWindowText
применять так же как и в GetClassName
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.03.2011, 13:49   #7
Lorden
Форумчанин
 
Регистрация: 11.08.2008
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
GetWindowText
применять так же как и в GetClassName
спасибо=) но возникл теперь новый вопрос, как можно вытянуть текст с отображением всех спец символов? тоесть с отображением символов переноса строки и т.п.?
Lorden вне форума Ответить с цитированием
Старый 04.03.2011, 13:53   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
function GetWndText(HWND:THandle):string;
begin
 SetLength(Result,GetWindowTextLength(HWND));
 SetLength(Result,GetWindowText(HWND,@Result[1],Length(Result));
end;
Код:
Memo1.Text:=GetWndText(Handle);
поидее так
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.03.2011, 14:17   #9
Lorden
Форумчанин
 
Регистрация: 11.08.2008
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
function GetWndText(HWND:THandle):string;
begin
 SetLength(Result,GetWindowTextLength(HWND));
 SetLength(Result,GetWindowText(HWND,@Result[1],Length(Result));
end;
Код:
Memo1.Text:=GetWndText(Handle);
поидее так
ммм вот у меня в Memo текст выглядит вот так:
Код:
&Открыть текст для его последующего преобразования
при таком коде:
Код:
var
Handle1, Handle2: integer;
begin
  Handle1 := 0;
  Handle2 := 0;
  while  Handle1 = 0 do
    begin
      Handle1 := FindWindow(nil, 'VCL');
   Label1.Caption:=IntTOStr(Handle1);
    end;
  Handle2 := FindWindowEx(Handle1, 0, nil, PChar(Memo1.lines.strings[0]));
  Label2.Caption:=IntTOStr(Handle2);
В Label2 хендл кнопки записывается верно, но при таком коде:
Код:
var
Handle1, Handle2: integer;
begin
  Handle1 := 0;
  Handle2 := 0;
  while  Handle1 = 0 do
    begin
      Handle1 := FindWindow(nil, 'VCL');
   Label1.Caption:=IntTOStr(Handle1);
    end;
  Handle2 := FindWindowEx(Handle1, 0, nil, '&Открыть текст для его последующего преобразования');
  Label2.Caption:=IntTOStr(Handle2);
Handle2 равен 0; Я думаю там скорее всего в тексте присутствуют спецсимволы.


Если вдруг кто не понимает что я пытаюсь сделать то вот пример:
Код:
Label1.caption:='Привет'+#13+'Это моя программа'
при запуске программы мы увидим такой текст:
Код:
Привет
Это моя программа
вот, а мне нужно чтобы в Label2.caption либо любым другим компонентом или ещё чём нить узнать что в Label1.caption содержится текст такого вида:
Код:
Привет+#13+Это моя программа
попробывал прочитать через TFileSteram но нечего не получилось =(

Последний раз редактировалось Lorden; 04.03.2011 в 16:12.
Lorden вне форума Ответить с цитированием
Старый 04.03.2011, 18:50   #10
Lorden
Форумчанин
 
Регистрация: 11.08.2008
Сообщений: 139
По умолчанию

Или если вышеописаное невозможно то возможно какнить вытащить все хендлы компонентов содержащихся на форме и закинуть их в массив?
Lorden вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависание программы при попытки получения сообщения. Lokos Работа с сетью в Delphi 8 28.08.2010 12:29
Как получить Handle моей программы? Eros Общие вопросы C/C++ 0 12.05.2010 19:29
Найти Handle главного Thread программы по HWND\PID окна ZaRDaK Win Api 3 20.12.2009 19:10
Как узнать handle окна имея handle обного из его компонентов SeRhy Win Api 2 18.10.2009 19:31
Не могу найти Handle Edit'а в окне чужой программы nechto Общие вопросы Delphi 32 05.03.2008 19:41