powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Странные странности... Получение заголовков окон.
13 сообщений из 13, страница 1 из 1
Странные странности... Получение заголовков окон.
    #39582289
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странные странности... В потоке получаю список заголовков окон. И если есть конект пишу в бд, если нету пишу в файл. Но почему то работает раз через раз. Нету ни ошибок, ни чего. Просто иногда записывает и всё ок. Потом вырубает и запускаю, и он ни чего не пишет. Тупо заходит в секцию if IsWindowVisible(Wnd) and ... и собственно типо ничего не нашел. И вот собственно вопрос: с чем это может быть связано?! Я уже просто не знаю. Я уже и новый проект создал и там всё ок работает(без потока, пустая форма с листом и кнопкой).

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
procedure TNewThread3.WriteHandle;
var
  Wnd: hWnd;
  buff: array[0..255] of Char;
begin
ConToDB3;

MyQuery3 := TADQuery.Create(nil);
MyQuery3.Connection := ADConnection3;
MyQuery3.Transaction := ADTransaction3;

While true do
 begin
  Wnd := GetWindow(handle, gw_HWndFirst);

 while Wnd <> 0 do
  begin
    if  IsWindowVisible(Wnd) and {-&#205;&#229;&#226;&#232;&#228;&#232;&#236;&#251;&#229; &#238;&#234;&#237;&#224;}
       (GetWindow(Wnd, gw_Owner) = 0) and {-&#196;&#238;&#247;&#229;&#240;&#237;&#232;&#232; &#238;&#234;&#237;&#224;}
       (GetWindowText(Wnd, buff, SizeOf(buff)) <> 0) {-&#206;&#234;&#237;&#224; &#225;&#229;&#231; &#231;&#224;&#227;&#238;&#235;&#238;&#226;&#234;&#238;&#226;} then
        begin

          if ADConnection3.Connected then
            begin
              MyQuery3.Transaction.StartTransaction;
            try
              GetWindowText(Wnd, buff, SizeOf(buff));
              MyQuery3.Close;
              MyQuery3.SQL.Text := 'Insert into handle (handle, Date_time)'
                                             +' values (:pHandle, :pDate_time);';
              MyQuery3.Prepare;
              MyQuery3.ParamByName('pHandle').Value := StrPas(buff);
              MyQuery3.ParamByName('pDate_time').AsDateTime := Now;
              MyQuery3.ExecSQL;
              MyQuery3.Transaction.Commit;
            except
              on E: Exception do
                begin
                  MyQuery3.Transaction.Rollback;
                  MSServisPK.AddLog(DateTimeToStr(Now) + ': &#206;&#248;&#232;&#225;&#234;&#224; &#239;&#240;&#232; &#231;&#224;&#239;&#238;&#235;&#237;&#229;&#237;&#232;&#232; Handl-&#238;&#226;!' + E.Classname + ':' + E.Message, 'SerError.txt');
                end; // End Exception
            end; // End try
           end; // End     if ADConnection3.Connected then

           if not ADConnection3.Connected then
            begin
              GetWindowText(Wnd, buff, SizeOf(buff));
              MSServisPK.AddLog('idp' + ';' + StrPas(buff) + ';' + DateTimeToStr(now), 'Log.txt');
            end;
        end; // End if
      Wnd := GetWindow(Wnd, gw_hWndNext);
  end; // End while Wnd <> 0
  sleep(10000);
end; //End while not false
end;
...
Рейтинг: 0 / 0
Странные странности... Получение заголовков окон.
    #39582320
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TNewThread3.Execute;
begin
try
  Success3:=CoInitialize(nil);
    try
      WriteHandle;
    finally
      case Success3 of
        S_OK, S_FALSE: CoUninitialize;
      end;
    end;
  except
    on E:Exception do
        MSServisPK.AddLog(DateTimeToStr(Now) + ': &#206;&#248;&#232;&#225;&#234;&#224; &#226; &#241;&#238;&#231;&#228;&#224;&#237;&#232;&#232; &#239;&#238;&#242;&#238;&#234;&#224; &#185;3. ' + E.Classname + ':' + E.Message, 'SerError.txt');
  end;
end;
...
Рейтинг: 0 / 0
Странные странности... Получение заголовков окон.
    #39582337
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,

Всё как бы работает. Но вот 3 раза всё ок пишет. А при другом запуске я тупо не попадаю дальше if IsWindowVisible(Wnd) and... И соответственно никакие данные не записываются.
...
Рейтинг: 0 / 0
Странные странности... Получение заголовков окон.
    #39582345
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gui нету. Это служба.
...
Рейтинг: 0 / 0
Странные странности... Получение заголовков окон.
    #39582347
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamero,
CoInitialize - это не синхронизация.
...
Рейтинг: 0 / 0
Странные странности... Получение заголовков окон.
    #39582353
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,

Я знаю. Но проблема не в этом.
...
Рейтинг: 0 / 0
Странные странности... Получение заголовков окон.
    #39582356
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я навсегда для себя решил, что обращение к окнам = обращение к gui.
Возможно то, что у вас работает через раз, это как раз проблема синхронизации. Могу ошибаться.
Зачем сделано через поток, если всё равно это другое приложение, к тому же служба?
...
Рейтинг: 0 / 0
Странные странности... Получение заголовков окон.
    #39582417
kamero, ... Return value .... If the function succeeds, the return value is the length, in characters, of the copied string, not including the terminating null character. If the window has no title bar or text, if the title bar is empty, or if the window or control handle is invalid, the return value is zero...

To get extended error information, call GetLastError .
...
Рейтинг: 0 / 0
Странные странности... Получение заголовков окон.
    #39582460
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тупо не попадаю,

М... не знаю как правильно объяснить. Но как то так.
Wnd := GetWindow(handle, gw_HWndFirst);
Кажется собака зарыта где-то здесь. Так как у меня служба, то handle у меня. По этому в основном потоке я не могу запустить эту фичу. А вот в потоке я не знаю откуда он берет этот handle(Вот тут и зарыто что-то). И соответственно он иногда находит, что-то непонятное и поэтому раз через раз работает. И вот как быть в этом случаи?! От чего отталкиваться?!
...
Рейтинг: 0 / 0
Странные странности... Получение заголовков окон.
    #39582487
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kameroА вот в потоке я не знаю откуда он берет этот handle(Вот тут и зарыто что-то).
Может потока?
...
Рейтинг: 0 / 0
Странные странности... Получение заголовков окон.
    #39582491
kamero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Так то оно так. Но поток это по идее дочерний. И когда я делаю gw_HWndFirst он по идее ковыряется в самом потоке иногда(ищет окна). А там их нет. По этому и результат 0(по этому дальше if не идет). А иногда поток как-то оказывается хз где и всё работает. Сложно объяснить.
Просто я уже не знаю куда рыть)) GetLastError ни чего не дал.
...
Рейтинг: 0 / 0
Странные странности... Получение заголовков окон.
    #39582496
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай про EnumWindows
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Странные странности... Получение заголовков окон.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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