Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Странные странности... Получение заголовков окон.  [new]
kamero
Member

Откуда:
Сообщений: 177
Странные странности... В потоке получаю список заголовков окон. И если есть конект пишу в бд, если нету пишу в файл. Но почему то работает раз через раз. Нету ни ошибок, ни чего. Просто иногда записывает и всё ок. Потом вырубает и запускаю, и он ни чего не пишет. Тупо заходит в секцию if IsWindowVisible(Wnd) and ... и собственно типо ничего не нашел. И вот собственно вопрос: с чем это может быть связано?! Я уже просто не знаю. Я уже и новый проект создал и там всё ок работает(без потока, пустая форма с листом и кнопкой).

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;
11 янв 18, 10:33    [21095940]     Ответить | Цитировать Сообщить модератору
 Re: Странные странности... Получение заголовков окон.  [new]
goldmi45
Member

Откуда:
Сообщений: 911
kamero,

стесняюсь спросить, а обращение к gui из потока синхронизируется?
11 янв 18, 11:08    [21096082]     Ответить | Цитировать Сообщить модератору
 Re: Странные странности... Получение заголовков окон.  [new]
kamero
Member

Откуда:
Сообщений: 177
goldmi45,

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;
11 янв 18, 11:21    [21096155]     Ответить | Цитировать Сообщить модератору
 Re: Странные странности... Получение заголовков окон.  [new]
kamero
Member

Откуда:
Сообщений: 177
kamero,

Всё как бы работает. Но вот 3 раза всё ок пишет. А при другом запуске я тупо не попадаю дальше if IsWindowVisible(Wnd) and... И соответственно никакие данные не записываются.
11 янв 18, 11:24    [21096173]     Ответить | Цитировать Сообщить модератору
 Re: Странные странности... Получение заголовков окон.  [new]
kamero
Member

Откуда:
Сообщений: 177
gui нету. Это служба.
11 янв 18, 11:30    [21096219]     Ответить | Цитировать Сообщить модератору
 Re: Странные странности... Получение заголовков окон.  [new]
goldmi45
Member

Откуда:
Сообщений: 911
kamero,
CoInitialize - это не синхронизация.
11 янв 18, 11:31    [21096223]     Ответить | Цитировать Сообщить модератору
 Re: Странные странности... Получение заголовков окон.  [new]
kamero
Member

Откуда:
Сообщений: 177
goldmi45,

Я знаю. Но проблема не в этом.
11 янв 18, 11:34    [21096255]     Ответить | Цитировать Сообщить модератору
 Re: Странные странности... Получение заголовков окон.  [new]
goldmi45
Member

Откуда:
Сообщений: 911
Я навсегда для себя решил, что обращение к окнам = обращение к gui.
Возможно то, что у вас работает через раз, это как раз проблема синхронизации. Могу ошибаться.
Зачем сделано через поток, если всё равно это другое приложение, к тому же служба?
11 янв 18, 11:36    [21096271]     Ответить | Цитировать Сообщить модератору
 Re: Странные странности... Получение заголовков окон.  [new]
тупо не попадаю
Guest
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.
11 янв 18, 12:21    [21096554]     Ответить | Цитировать Сообщить модератору
 Re: Странные странности... Получение заголовков окон.  [new]
kamero
Member

Откуда:
Сообщений: 177
тупо не попадаю,

М... не знаю как правильно объяснить. Но как то так.
Wnd := GetWindow(handle, gw_HWndFirst);
Кажется собака зарыта где-то здесь. Так как у меня служба, то handle у меня. По этому в основном потоке я не могу запустить эту фичу. А вот в потоке я не знаю откуда он берет этот handle(Вот тут и зарыто что-то). И соответственно он иногда находит, что-то непонятное и поэтому раз через раз работает. И вот как быть в этом случаи?! От чего отталкиваться?!
11 янв 18, 13:06    [21096796]     Ответить | Цитировать Сообщить модератору
 Re: Странные странности... Получение заголовков окон.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23329
kamero
А вот в потоке я не знаю откуда он берет этот handle(Вот тут и зарыто что-то).

Может потока?
11 янв 18, 13:40    [21097068]     Ответить | Цитировать Сообщить модератору
 Re: Странные странности... Получение заголовков окон.  [new]
kamero
Member

Откуда:
Сообщений: 177
wadman,

Так то оно так. Но поток это по идее дочерний. И когда я делаю gw_HWndFirst он по идее ковыряется в самом потоке иногда(ищет окна). А там их нет. По этому и результат 0(по этому дальше if не идет). А иногда поток как-то оказывается хз где и всё работает. Сложно объяснить.
Просто я уже не знаю куда рыть)) GetLastError ни чего не дал.
11 янв 18, 13:49    [21097126]     Ответить | Цитировать Сообщить модератору
 Re: Странные странности... Получение заголовков окон.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23329
Почитай про EnumWindows
11 янв 18, 13:57    [21097156]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить