![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте!
У меня такой вопрос как сделать (какую использовать функцию), что бы определить в любом (ЧУЖОМ) приложении, что курсор находиться на компоненте имеющего фокус ввода (что в этом компоненте в данный момент мигает каретка ввода). |
#2
|
||||
|
||||
![]() узнать класс активного окна, имеющего клавиатурный фокус ввода:
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Mask; type TForm1 = class(TForm) Timer1: TTimer; Label1: TLabel; Label2: TLabel; Label3: TLabel; Edit1: TEdit; Edit2: TEdit; MaskEdit1: TMaskEdit; procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); var hid, h: THandle; data: array [0..$ff] of Char; l: Integer; rct: TRect; begin Label1.Caption:=''; Label2.Caption:=''; Label3.Caption:=''; begin hid:=GetForegroundWindow; AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(hid, nil), True); h:=GetFocus; if h>0 then begin l:=GetClassName(h, data, $100); if l>0 then Label1.Caption:=Copy(data, 1, l); if Windows.GetClientRect(h, rct) then Label2.Caption:=IntToStr(rct.Left)+','+IntToStr(rct.Top)+'/'+IntToStr(rct.Right)+','+IntToStr(rct.Bottom); l:=GetWindowText(h, data, $100); if l>0 then Label3.Caption:=Copy(data, 1, l); end; AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(hid, nil), False); end; end; end. http://data.cod.ru/70523 а уж мигает в нем что-то или нет... Пишу программы за еду. __________________ |
#3
|
|||
|
|||
![]() Спасибо за ответ. Но как мне узнать?:
1. что курсор находиться в данный момент на этом компоненте (приводятся локальные координаты компонента, а не глобальные) 2. и что компонент имеет в данный момент фокус (готов к набору текста), то есть, если пользователь нажмет какую-нибудь букву на клаве, то текст будет введен именно в этот компонент. |
#4
|
||||
|
||||
![]() 1. выводятся экранные координаты окна:
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Mask; type TForm1 = class(TForm) Timer1: TTimer; Label1: TLabel; Label2: TLabel; Label3: TLabel; Edit1: TEdit; Edit2: TEdit; MaskEdit1: TMaskEdit; procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Types; {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); var hid, h: THandle; data: array [0..$ff] of Char; l: Integer; rct: TRect; p: TPoint; begin Label1.Caption:=''; Label2.Caption:=''; Label3.Caption:=''; begin hid:=GetForegroundWindow; AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(hid, nil), True); h:=GetFocus; if h>0 then begin l:=GetClassName(h, data, $100); if l>0 then Label1.Caption:=Copy(data, 1, l); if Windows.GetClientRect(h, rct) then begin p.X:=rct.Left; p.Y:=rct.Top; Windows.ClientToScreen(h, p); Label2.Caption:=IntToStr(p.X)+','+IntToStr(p.Y)+'/'+IntToStr(rct.Right)+','+IntToStr(rct.Bottom); end; l:=GetWindowText(h, data, $100); if l>0 then Label3.Caption:=Copy(data, 1, l); end; AttachThreadInput(GetCurrentThreadId, GetWindowThreadProcessId(hid, nil), False); end; end; end. Пишу программы за еду. __________________ |
#5
|
|||
|
|||
![]() Спасибо, но к сожалению этот способ работает не везде. Например в Mozila FireFox, куда бы не кликнешь, хоть просто по тексту, хоть в строке ввода адреса URL, везде пишет класс MozilaWindowClass. А хотелось бы как то от каретки ввода плясать, т.е. как я уже говорил ранее, если компонент в фокусе и у него мигает в данный момент каретка.
|