powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Заголовки окон
25 сообщений из 26, страница 1 из 2
Заголовки окон
    #39604999
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function GetWindowTitle(hwnd: HWND): string;
begin
  SetLength(Result, 255);
  if IsWindowVisible(hwnd) and
    (GetWindow(hwnd, gw_Owner) = 0) and
    (GetWindowText(hwnd, PChar(Result), 255) <> 0) then
      SetLength(Result, GetWindowText(hwnd, PChar(Result), 255));
end;

function EnumWindowsProc(hwnd: HWND; lParam: Integer): BOOL; stdcall;
begin
  Result := True;
  TListBox(lParam).Items.Add(GetWindowTitle(hwnd));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 ListBox1.Items.Clear;
 EnumWindows(@EnumWindowsProc, Integer(ListBox1));
end;



Получаю заголовки окон, но откуда-то появляются дубликаты. Помогите убрать их.
...
Рейтинг: 0 / 0
Заголовки окон
    #39605023
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kameroоткуда-то появляются дубликаты

почему ты считаешь, что не может быть окон с одинаковыми заголовками?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заголовки окон
    #39605029
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Пример: открыто 5 программ, в каждой программе открытоа по три окна, в каждом окне есть кнопка OK

Вот тебе и готово - 15 окон с одинаковым заголовком "OK".

Кроме того учти, что если ты не видишь каких-то окон - это не значит что они не существуют, они могут существовать, но быть до поры невидимыми (скрытыми, закрытыми, называй как хочешь).

В общем берешь программу типа Microsoft Spy++ или winSight32 и смотришь, что у тебя на компьютере с точки зрения Win32 GDI API
...
Рейтинг: 0 / 0
Заголовки окон
    #39605265
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В том то и дело что они мне не нужны... Знаю я про то что окон может быть много. Но вот если их вытаскивать через GetWindowText в цикле. То на winXP, я их не получаю. А на 7ке они работают отлично. На мсдн, написано, что EnumWindows, работает лучше. Но что-то у меня не получается выдрать нормально эти заголовки, как вот этим кодом.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
var
  H: Thandle;
  Wnd: hWnd;
  buff: array[0..255] of Char;
begin
ListBox1.Clear;
      H := FindWindow(nil,'Program Manager');
      Wnd := GetWindow(H, gw_HWndFirst);

      while Wnd <> 0 do
        begin
          if IsWindowVisible(Wnd) and
             (GetWindow(Wnd, gw_Owner) = 0) and
             (GetWindowText(Wnd, buff, SizeOf(buff)) <> 0) then
            begin
              GetWindowText(Wnd, buff, SizeOf(buff));
              ListBox1.Items.add(StrPas(buff));
            end; // End if
          Wnd := GetWindow(Wnd, gw_hWndNext);
      end; // End while Wnd <> 0
...
Рейтинг: 0 / 0
Заголовки окон
    #39605273
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался, теперь делает то что надо. Но есть еще 1 проблемка...
LPARAM(ListBox1); <--
Что можно сюда передать? У меня приложение без формы. И соответственно, на ней нет ЛистБокса.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function EnumWindowsProc(wHandle: HWND; lb: TListBox): BOOL; stdcall;
var
  Title: array[0..255] of char;
begin
  GetWindowText(wHandle, Title, 255);
  if IsWindowVisible(wHandle)
  and (GetWindow(wHandle, gw_Owner) = 0)
  and (GetWindowText(wHandle, Title, 255) <> 0) then
    lb.Items.Add(string(Title));
  Result := True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  ListBox1.Items.Clear;
  EnumWindows(@EnumWindowsProc, LPARAM(ListBox1));
end;
...
Рейтинг: 0 / 0
Заголовки окон
    #39605278
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно, каждый title записать в БД.
...
Рейтинг: 0 / 0
Заголовки окон
    #39605284
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да что угодно передавай.
Например, передавай класс, который пишет в БД, и в EnumWindowsProc используй его.
...
Рейтинг: 0 / 0
Заголовки окон
    #39605292
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r, что не так делаю?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function EnumWindowsProc(wHandle: HWND; lb: TMSServisPC): BOOL; stdcall;
var
  Title: array[0..255] of char;
begin
  GetWindowText(wHandle, Title, 255);
  if IsWindowVisible(wHandle)
  and (GetWindow(wHandle, gw_Owner) = 0)
  and (GetWindowText(wHandle, Title, 255) <> 0) then
    MSServisPC.WriteCaption(string(Title)); //Процедура записи в БД
  Result := True;
end;

procedure TNewThread3.WriteHandle;
begin
While not NewThread3.Terminated do
  begin
    EnumWindows(@EnumWindowsProc, LPARAM(TMSServisPC)); // Класс где находится процедура
    sleep(WaitHandleWrite);
  end;
end;
...
Рейтинг: 0 / 0
Заголовки окон
    #39605360
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kameroVizit0r, что не так делаю?Передаете класс, а принимаете объект
...
Рейтинг: 0 / 0
Заголовки окон
    #39605363
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function EnumWindowsProc(wHandle: HWND; lParam: Integer): BOOL; stdcall;
var
  Title: array[0..255] of char;
begin
  GetWindowText(wHandle, Title, 255);
  if IsWindowVisible(wHandle)
  and (GetWindow(wHandle, gw_Owner) = 0)
  and (GetWindowText(wHandle, Title, 255) <> 0) then
    MSServisPC.WriteCaption(string(Title));
  Result := True;
end;

procedure TNewThread3.WriteHandle;
begin
While not NewThread3.Terminated do
  begin
    EnumWindows(@EnumWindowsProc, integer(TNewThread3));
    sleep(WaitHandleWrite);
  end;
end;



Сделал вот так, но теперь почему-то поток не циклится. Ииии заголовки не вытаскиваются( либо 1 от Delphi).
...
Рейтинг: 0 / 0
Заголовки окон
    #39605373
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero
Код: pascal
1.
integer(TNewThread3)


Зачем передаешь ссылку на класс потока (даже не на экземпляр)?

Попробуй это GetDesktopWindow .
...
Рейтинг: 0 / 0
Заголовки окон
    #39605379
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Я уже всё перетыкал... (Это служба, и в ней несколько потоков).
...
Рейтинг: 0 / 0
Заголовки окон
    #39605390
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kameroЭто службаКак Вы думаете, с каким десктопом работает служба и какие она видит окна?
...
Рейтинг: 0 / 0
Заголовки окон
    #39605391
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kameroЯ уже всё перетыкал..Не нужно перетыкивать. Нужно читать документацию и понимать, что делает каждая строчка кода
...
Рейтинг: 0 / 0
Заголовки окон
    #39605420
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Я уже честно говорю уже перечитал всю документацию... Но хоть убей, не могу понять почему не работает.
...
Рейтинг: 0 / 0
Заголовки окон
    #39605436
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kameroЯ уже честно говорю уже перечитал всю документацию...
Сила! Я вот не могу сказать про себя, что прочёл всю документацию.
...
Рейтинг: 0 / 0
Заголовки окон
    #39605475
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
21.02.2018 12:46, wadman пишет:
> Сила! Я вот не могу сказать про себя, что прочёл _*всю*_ документацию.

везёт вам, мужики. вы ЧИТАТЬ умеете...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заголовки окон
    #39605522
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero
Код: pascal
1.
  buff: array[0..255] of Char;



А если там больше ?
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms633521.aspx

kamero
Код: pascal
1.
GetWindowText(Wnd, buff, SizeOf(buff))



SIZEOF ???
Хочешь переполнение буфера получить? ну дело твоё.
На старых Delphi это конечно работало, так уж совпало....


kamero
Код: pascal
1.
procedure TNewThread3.


Зачем?
TThread - это весьма не удобно....

http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Classes.TThread.CreateAnonymousThread
https://stackoverflow.com/questions/34890222/createanonymousthread-with-parameters

kameroМне нужно, каждый title записать в БД.

1) ну и зачем тебе вообще с потоками связываться?
2) если жизнь без потоков не мила - клади названия, прямо строками, в iOmniBlockingCollection
А в основном окне по таймеру проверяй, если в коллекцию что-то нападало, то открывай транзакцию, срасывай в БД и коммить.

Только нафиг тут потоки вообще не нужны
...
Рейтинг: 0 / 0
Заголовки окон
    #39605615
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochSIZEOF ???
А что не так с SizeOf() *статического* массива?
...
Рейтинг: 0 / 0
Заголовки окон
    #39605619
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpAriochSIZEOF ???
А что не так с SizeOf() *статического* массива?
Результат в байтах, а не в символах, которые могут быть и 2 байта. И больше.
...
Рейтинг: 0 / 0
Заголовки окон
    #39605620
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
21.02.2018 16:20, alekcvp пишет:
> А что не так с SizeOf() *статического* массива?

один чар не всегда равен одному байту
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заголовки окон
    #39605660
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

читаем описание функции SizeOf (что она возвращает) и описание функции GeetWindowsText (что она ожидает в третьем аргументе), потом сравниваем

alekcvp*статического* массива?

использование статического массива на стеке уже само по себе раскладывание граблей

тем более при наличие в delphi весьма удобного типа string
...
Рейтинг: 0 / 0
Заголовки окон
    #39605667
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё гораздо проще оказалось...

Начиная с Windows Vista сервис не имеет доступа к десктопу. Поэтому не может ничего отловить. А для Windows-XP флаг Interactive в true необходимо поставить. Чтобы это работало и там и там, пришлось вернуться к циклу GetWindowText.

А то что я кручу в потоках хэндлы. Чтобы отловить новые и записать в бд, без дублей. Поток живет отдельной жизнью, и время от времени кидает в основной что нашел.

А то что свыше 255 символов, отбрасывается. (да и уже месяц проработала, и не было таких длинных заголовков).

GetDesktopWindow, EnumWindowsProc и т.д. и т.п. Не будут работать в службе, в следствии того что я написал выше.


Так что вот так.
...
Рейтинг: 0 / 0
Заголовки окон
    #39605731
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Извини, сегодня как раз все телепаты разъехались. Они бы, конечно, точно узнали бы, что оказывается ты код запускаешь как сервис. Пиши сразу условия работы кода максимально, всем проще.
...
Рейтинг: 0 / 0
Заголовки окон
    #39605772
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonИзвини, сегодня как раз все телепаты разъехались.Был один 21207489
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Заголовки окон
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]