Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.05.2016, 16:15
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 280
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию EmumWindows В потоке?

Снова я и снова вопрос. Есть поток, который ищет окна класса Х и если их находит, то пишет Rect, hwnd, и кол-во этих окон:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function EnumWindowsProc(h: HWND; lParam: LPARAM): Boolean; stdcall;
var
  CN: array [0..1023] of Char;
  I: Integer;
  WndRect :TRect;
begin
 
  Result := True;
  i:=1;
 
  GetClassName(h, @CN, 1024);
if CN='х' then
begin
MyRec.table[i].HWND:=h;
GetWindowRect(h, WndRect)     ;
MyRaec.table[i].HRect:= WndRect;
myrec.max:=i;
 inc (i);
end else


Структура Myrec
Код:
1
2
3
4
5
6
7
8
9
10
11
    type
 
Myrec= record
HWND: HWND;
HRect: TRect;
end;
type
PMyrec= record
table : array [1..12] of Myrec;
max: Integer;
end;
Поток
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type
 TWaitTable = class(TThread)
private
x:Integer;
y:Integer;
tab: MyRec;
pab:Pmyrec;
className:string;
fibish:Boolean;
  { Private declarations }
protected
  procedure Execute; override;
  procedure finished;
  procedure ishud;
end;
Вызов:
Код:
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
procedure TWaitTable.Execute;
  var
  i: Integer;
  begin
  while not Terminated do
  begin
    Myrec.max:=0;
      EnumWindows (@EnumWindowsProc,0);
      if Myrec.max>0 then
      begin
      pab:=myrec;
        for i := 1 to pab.max do
          begin
          tab:=pab.table[i];
      ;     Synchronize(ishud);
 
 
          end;
      end;
  end;
  end;
procedure TWaitTable.ishud;
  var
  tobLeft: TPoint;
  aName: array [0..255] of Char;
  shud,shud2: string;
  hw: HWND;
  begin
   tobLeft.x:=Tab.HRect.left;
   tobLeft.Y:=tab.HRect.Top;
   tobLeft:=tobLeft+ ROP;
В итоге HRect не равен ректу окна. в чем напутал?

Последний раз редактировалось nixon232, 08.05.2016 в 16:25.
Ответить с цитированием
  #2  
Старый 10.05.2016, 14:15
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 280
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Что форум совсем глючит, пропадают сообщения.
Решил вот так, не знаю как это на что-то влияет, но не суть
Код:
1
2
3
4
5
6
7
8
----
for i := 1 to pab.max do
          begin
 
          tab:=pab.table[i];
          y:=tab.HRect.Top;
          x:=tab.HRect.Left;
---
возникла новая странность: мне нужно чтобы процедура выполнялась если не нажат любой из модификатор. По кнопке оно работает, а в потоке всегда возвращает True;
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function CanClick: Boolean;
  var State:TKeyboardState;
  begin
  Result:=False;
    GetKeyboardState(State);
  Result := not(((State[vk_Control] and 128) <> 0) or
      ((State[VK_SHIFT] and 128) <> 0) or
      ((State[VK_MENU] and 128) <> 0))
  end;
fibish:=false;
fibish:=CanClick;
         if fibish then
         begin
           HudKB(p,tab.HWND);
           sleepex(2000, true);
         end;
Я не понимаю, почему всегда True? и что делать? запускать CanClick в отдельно потоке?
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:07.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025