Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Заголовки окон / 25 сообщений из 26, страница 1 из 2
20.02.2018, 17:29
    #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
20.02.2018, 17:54
    #39605023
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заголовки окон
kameroоткуда-то появляются дубликаты

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

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

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

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

В общем берешь программу типа Microsoft Spy++ или winSight32 и смотришь, что у тебя на компьютере с точки зрения Win32 GDI API
...
Рейтинг: 0 / 0
21.02.2018, 09:11
    #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
21.02.2018, 09:27
    #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
21.02.2018, 09:33
    #39605278
kamero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заголовки окон
Мне нужно, каждый title записать в БД.
...
Рейтинг: 0 / 0
21.02.2018, 09:42
    #39605284
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заголовки окон
да что угодно передавай.
Например, передавай класс, который пишет в БД, и в EnumWindowsProc используй его.
...
Рейтинг: 0 / 0
21.02.2018, 09:56
    #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
21.02.2018, 11:38
    #39605360
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заголовки окон
kameroVizit0r, что не так делаю?Передаете класс, а принимаете объект
...
Рейтинг: 0 / 0
21.02.2018, 11:42
    #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
21.02.2018, 11:51
    #39605373
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заголовки окон
kamero
Код: pascal
1.
integer(TNewThread3)


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

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

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

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

везёт вам, мужики. вы ЧИТАТЬ умеете...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.02.2018, 14:09
    #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
21.02.2018, 16:20
    #39605615
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заголовки окон
AriochSIZEOF ???
А что не так с SizeOf() *статического* массива?
...
Рейтинг: 0 / 0
21.02.2018, 16:30
    #39605619
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заголовки окон
alekcvpAriochSIZEOF ???
А что не так с SizeOf() *статического* массива?
Результат в байтах, а не в символах, которые могут быть и 2 байта. И больше.
...
Рейтинг: 0 / 0
21.02.2018, 16:31
    #39605620
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заголовки окон
21.02.2018 16:20, alekcvp пишет:
> А что не так с SizeOf() *статического* массива?

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

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

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

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

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

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

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

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

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


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

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


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