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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2011, 18:00   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию Поиск видимого окна по части его заголовка

Всем привет!

Интересует вопрос:
как искать окно зная только часть его заголовка?

При том что не известен класс окна, или известен, но таких окон много а заголовки разные.
Человек_Борща вне форума Ответить с цитированием
Старый 07.03.2011, 23:34   #2
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию

вот выводит текст видимых окон и ид. ну pos-ом ищем (в WinCaption) имеющую часть заголовка и присваиваем ид
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
  procedure AppInfo;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function AddWinInfo(WinHandle: HWnd; list:TStringList): Boolean;
stdcall;
var  WinCaption: array[0..255] of Char;
begin
  Result:=True;
  if isWindowVisible(WinHandle) then
  if GetWindow(WinHandle,GW_OWNER)=0 then
  begin
  GetWindowText(WinHandle,WinCaption,SizeOf(WinCaption));
  if (WinCaption<>'')  then
  List.Add(inttostr(WinHandle));
  end;
end;

procedure TForm1.AppInfo;
var descript:TStringList;
    WinCaption:array[0..255] of char;
    i:word;

begin
descript:=TStringList.Create;
with descript do
  begin
    Clear;
    EnumWindows(@AddWinInfo,LParam(descript));
  end;
for i:=0 to descript.Count-1 do
 begin
  GetWindowText(strtoint(descript.strings[i]),WinCaption,SizeOf(WinCaption));

 memo1.Lines.Add('Текст: '+WinCaption+'   Ид:'+descript.strings[i])
 end;
descript.Destroy;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
AppInfo;
end;

end.
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]

Последний раз редактировалось Volt; 07.03.2011 в 23:50.
Volt вне форума Ответить с цитированием
Старый 08.03.2011, 21:41   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Авот допустим Я нашёл вот такой код:
Код:
function FindNextWnd(StartHWND: HWND; AString : String): HWND;
var
  Buffer : array [0..255] of char;
begin
  Result := StartHWND;
  repeat
    Result := FindWindowEx(0, Result, nil, nil);
    GetWindowText(Result, Buffer, SizeOf(Buffer));
    if StrPos(StrUpper(Buffer), PChar(UpperCase(AString))) <> nil
    then  Break;
  until (Result = 0);
end;
Как его использовать?
В первый параметр передать хэндл рабочего стола?
Человек_Борща вне форума Ответить с цитированием
Старый 08.03.2011, 21:56   #4
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию

начать с 0. т.е FindNextWnd(0, 'текст')
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]
Volt вне форума Ответить с цитированием
Старый 08.03.2011, 21:58   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

передай 0.(правда это и есть хендл рабочего стола)

я лично люблю делать все через Enum* функции, но разницы нет, ибо они скорее всего так и поступают(как в вашей функции)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.03.2011, 22:20   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Благодарен! Вот что у меня получилось:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  hW:HWND;
  Buffer : array [0..255] of char;
begin
  hW:=FindNextWnd(0,'Fatal');
  If hW > 0 then
  begin
  GetWindowText(hW,Buffer,SizeOf(Buffer));
  ShowMessage('Найдено окно: '+buffer);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
MessageBox(0,'Message!','Fatal Error - HTTPS server',MB_OK or MB_ICONERROR);
end;
и работает!

Вопрос решён!
Человек_Борща вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать высоту (px) заголовка окна zotox Win Api 1 26.11.2010 16:08
Замена заголовка чужого окна dacorp Общие вопросы Delphi 3 13.06.2010 00:05
поиск слова по его части Рустам Помощь студентам 3 10.03.2009 20:54
Как изменить цвет заголовка окна CraZZy RabbIt Общие вопросы Delphi 3 20.02.2009 15:47
Область заголовка окна HunterMan Win Api 3 14.04.2008 15:37