11.04.2014, 12:58
|
Прохожий
|
|
Регистрация: 26.02.2013
Сообщения: 30
Версия Delphi: Lazarus, XE 3.
Репутация: 10
|
|
Класс для получения хэндлов чужих окон\контролов
Класс для получения хэндлов с контролов формы, самих окон. Очень часто использую.
Код:
unit DTM_HandlePicker;
interface
uses
System.Classes,System.SysUtils,Vcl.Controls,Vcl.Graphics,
Vcl.Forms,Winapi.Windows;
type
THandlePicker = class
private
FHandle: HDC;
FHasPicked: Boolean;
public
property Handle: HDC read FHandle write FHandle;
property HasPicked: Boolean read FHasPicked write FHasPicked;
constructor Create;
procedure Reset;
procedure Drag;
end;
implementation
{ THandlePicker }
constructor THandlePicker.Create;
begin
Reset;
end;
procedure THandlePicker.Drag;
var
TargetRect: TRect;
Region : HRGN;
Cursor : TCursor;
TempHandle : Hwnd;
DragForm : TForm;
EdgeForm : TForm;
Style : DWord;
W,H: integer;
const
EdgeSize =4;
WindowCol = clred;
begin;
Cursor:= Screen.Cursor;
Screen.Cursor:= crCross;
TempHandle := GetDesktopWindow;
EdgeForm := TForm.Create(nil);
EdgeForm.Color:= WindowCol;
EdgeForm.BorderStyle:= bsNone;
DragForm := TForm.Create(nil);
DragForm.Color:= WindowCol;
DragForm.BorderStyle:= bsNone;
Style := GetWindowLong(DragForm.Handle, GWL_EXSTYLE);
SetWindowLong(DragForm.Handle, GWL_EXSTYLE, Style or WS_EX_LAYERED or WS_EX_TRANSPARENT);
SetLayeredWindowAttributes(DragForm.Handle, 0, 100, LWA_ALPHA);
try
while GetAsyncKeyState(VK_LBUTTON) <> 0 do
begin;
Handle:= WindowFromPoint(Mouse.CursorPos);
if (Handle <> TempHandle) and (Handle <> EdgeForm.Handle) then
begin;
EdgeForm.Show;
DragForm.Show;
GetWindowRect(Handle, TargetRect);
W :=TargetRect.Right - TargetRect.Left+1;
H :=TargetRect.Bottom - TargetRect.Top+1;
DragForm.SetBounds(TargetRect.Left,TargetRect.top,W,H);
SetWindowRgn(EdgeForm.Handle,0,false);
Region := CreateRectRgn(0,0,w-1,h-1);
CombineRgn(Region,Region,CreateRectRgn(EdgeSize,EdgeSize,w-1-(edgesize),h-1-(edgesize)),RGN_XOR);
SetWindowRgn(edgeform.Handle,Region,true);
EdgeForm.SetBounds(TargetRect.Left,TargetRect.top,W,H);
TempHandle := Handle;
end;
Application.ProcessMessages;
Sleep(30);
end;
Handle := TempHandle;
haspicked:= true;
Screen.Cursor:= cursor;
finally
DragForm.Hide;
DragForm.Free;
EdgeForm.Hide;
EdgeForm.Free;
end;
end;
procedure THandlePicker.Reset;
begin
HasPicked:=false;
Handle:=0;
end;
end.
Как использовать - создаем экземпляр класса, и в обработчике MouseDown вызывающего контрола - вызываем метод Drag. В свойстве Handle - будет тот хэндл, который мы выделили.
Последний раз редактировалось CynicRus, 11.04.2014 в 14:32.
|