|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Класс для получения хэндлов чужих окон\контролов
Класс для получения хэндлов с контролов формы, самих окон. Очень часто использую.
Код:
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. |