![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите, плиз, с нахождением под курсором Handle любого окна [D7, WinXP]
dmitry_12_08_73 © (2008-08-24 13:22:00)Подскажите, как под текущим курсором найти Handle любого окна, отображённого на экране, включая и таскбар. Функция WindowFromPoint определяет Handle только для своего приложения.
dmitry_12_08_73 (2008-08-24 15:16:00) [1]Ещё раз спасибо, мне надо как раз функция GetWindowRect
{RASkov} (2008-08-24 14:54:00) [2]
> [9] dmitry_12_08_73 © (24.08.08 14:43)
> Нужно определять размеры любых находящихся на экране окон
GetWindowRect ?
> том числе и таскбара
Например:
function GetTaskHeight: Integer;
begin
Result:=Max(Screen.Height-Screen.WorkAreaHeight, Screen.Width-Screen.WorkAreaWidth);
end;
dmitry_12_08_73 (2008-08-24 14:43:00) [3]Нужно определять размеры любых находящихся на экране окон, в том числе и таскбара. Это, я так понимаю, возможно для окон, у которых есть Handle.
{RASkov} (2008-08-24 14:32:00) [4]> [7] dmitry_12_08_73 © (24.08.08 14:23)
> FindControl за пределами своей формы возвращает nil
А вот тут смотрим:
function FindControl(Handle: HWnd): TWinControl;
var
OwningProcess: DWORD;
begin
Result := nil;
if (Handle <> 0) and (GetWindowThreadProcessID(Handle, OwningProcess) <> 0) and
(OwningProcess = GetCurrentProcessId)then
..............
> как это побороть?
А что конкретно нужно-то? Может есть другие способы, ибо не во всех окнах есть VCL...
dmitry_12_08_73 (2008-08-24 14:23:00) [5]Вот дальше пытаюсь найти указатель на текущее окно по полученному Handle и FindControl за пределами своей формы возвращает nil, как это побороть?
dmitry_12_08_73 (2008-08-24 14:01:00) [6]Спасибо, Вы как всегда оказались правы!
{RASkov} (2008-08-24 13:48:00) [7]> пост у(ы)пать
переодически их почему-то путаю :)
{RASkov} (2008-08-24 13:46:00) [8]> [3] dmitry_12_08_73 © (24.08.08 13:37)
> Почему сразу врешь?
потому что сделай так:
procedure TForm1. Timer1Timer(Sender: TObject);
var P: TPoint;
begin
GetCursorPos(P);
Caption:=IntToStr(WindowFromPoint(P));
end;
:)
А в твоем варианте сообщения мыши перестают постыпать окну за пределами формы....
dmitry_12_08_73 (2008-08-24 13:37:00) [9]Почему сразу врешь?
Делаю в событии OnMessage компонента TApplicationMessage обработку:
procedure TForm1.aev_ApplicationEventsMessage(var Msg: tagMSG;
var Handled: Boolean);
var
pt : TPoint;
Handle : THandle;
begin
GetCursorPos(pt);
Handle := WindowFromPoint(pt);
Label1.Caption := IntTostr(Handle); //метка на форме для отображения Handle текущего окна
end;
При перемещении курсора по экрану видим изменения Handle только для своего приложения, для других окон Handle не меняется, почему?
{RASkov} (2008-08-24 13:31:00) [10]Скажи как ты получаешь координаты тек. курсора... Тут скорее всего у тебя и ошибка)
{RASkov} (2008-08-24 13:29:00) [11]> [0] dmitry_12_08_73 © (24.08.08 13:22)
> Функция WindowFromPoint определяет Handle только для своего приложения.
Врешь...