unit main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, myZoomBox, myTrackBar; type TMyTrackBar = class(TTrackBar) published { Published 宣言 } property OnMouseDown; property OnMouseMove; property OnMouseUp; end; type TForm1 = class(TForm) Panel1: TPanel; CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; CheckBox4: TCheckBox; Button1: TButton; Panel2: TPanel; TrackBar1: TTrackBar; Timer1: TTimer; CheckBox5: TCheckBox; Button2: TButton; procedure FormCreate (Sender: TObject); procedure TrackBar1Change(Sender: TObject); procedure CheckBox1Click (Sender: TObject); procedure CheckBox2Click (Sender: TObject); procedure CheckBox3Click (Sender: TObject); procedure CheckBox4Click (Sender: TObject); procedure Button1Click (Sender: TObject); procedure Timer1Timer (Sender: TObject); procedure CheckBox5Click(Sender: TObject); procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormDblClick(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private 宣言 } ZoomBox1 : TZoomBox; //ちらつきを抑えるため // procedure WMEraseBkGnd(var Msg: TMessage); message WM_ERASEBKGND; //ディスプレイの設定の変更を捕らえる procedure WMDisplayChange(var Msg: TMessage); message WM_DISPLAYCHANGE; //ルーペモード実現のため procedure WMMove(var Msg: TWMMove); message WM_MOVE; public { Public 宣言 } end; var Form1: TForm1; implementation uses myDebug, myWindow, Clipbrd; {$R *.dfm} { procedure TForm1.WMEraseBkGnd(var Msg: TMessage); //ちらつきを抑えるため begin //http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+200504/05040066.txt Msg.Result:=0; end; } procedure TForm1.WMDisplayChange(var Msg: TMessage); //ディスプレイ設定の変更を反映 begin ZoomBox1.DisplayChange(nil); end; procedure TForm1.WMMove(var Msg: TWMMove); begin if (CheckBox5.Checked) then begin ZoomBox1.Position := ZoomBox1.ClientOrigin; Msg.Result := 0; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Self.DoubleBuffered := True; ZoomBox1 := TZoomBox.Create(Self); ZoomBox1.Align := alClient; ZoomBox1.BGColor := clWhite; ZoomBox1.IsCenter := CheckBox1.Checked; ZoomBox1.IsLayeredWindow := CheckBox2.Checked; ZoomBox1.IsMouseCursor := CheckBox3.Checked; ZoomBox1.IsDragPosition := not(CheckBox4.Checked); ZoomBox1.OnMouseUp := FormMouseUp; TrackBar1.Position := 2; TrackBar1Change(nil); Timer1.Enabled := True; end; procedure TForm1.TrackBar1Change(Sender: TObject); begin //ズーム倍率 ZoomBox1.Zoom := TrackBar1.Position; Self.Caption := Format('%d倍', [ZoomBox1.Zoom]); //myDebug.gpcDebug(['TB', BOOL(Hi(GetAsyncKeyState(VK_LBUTTON)))]); end; procedure TForm1.CheckBox1Click(Sender: TObject); begin //キャプチャポイントを表示画面の真ん中に持ってくるか ZoomBox1.IsCenter := CheckBox1.Checked; end; procedure TForm1.CheckBox2Click(Sender: TObject); begin //レイヤードウィンドウをキャプチャするか ZoomBox1.IsLayeredWindow := CheckBox2.Checked; end; procedure TForm1.CheckBox3Click(Sender: TObject); begin //マウスカーソルをキャプチャするか ZoomBox1.IsMouseCursor := CheckBox3.Checked; end; procedure TForm1.CheckBox4Click(Sender: TObject); begin if (CheckBox4.Checked) then begin //カーソル追従 ZoomBox1.IsDragPosition := False; end else begin //マウスでつかんで移動 ZoomBox1.IsDragPosition := True; end; end; procedure TForm1.CheckBox5Click(Sender: TObject); //ルーペモード begin if (CheckBox5.Checked) then begin Self.AlphaBlend := True; CheckBox2.Checked := False; //レイヤードウィンドウはキャプチャしない CheckBox2Click(nil); CheckBox4.Checked := False; //カーソル追従しない CheckBox4Click(nil); ZoomBox1.IsDragPosition := False; //ドラッグしてキャプチャポイントの移動はしない ZoomBox1.Position := ZoomBox1.ClientOrigin; end else begin Self.AlphaBlend := False; CheckBox4Click(nil); //ドラッグしてキャプチャポイントの移動のセット end; end; procedure TForm1.Timer1Timer(Sender: TObject); var lpt_Pos : TPoint; begin if (CheckBox4.Checked) then begin //カーソル追従 GetCursorPos(lpt_Pos); //現在のマウスカーソルの位置を取得して ZoomBox1.Position := lpt_Pos; //キャプチャポイントにセット end else begin //定点キャプチャ、ルーペモード ZoomBox1.Capture; end; end; procedure TForm1.Button1Click(Sender: TObject); //クリップボードへコピー var l_Bitmap : TBitmap; begin l_Bitmap := TBitmap.Create; try ZoomBox1.GetBitmap(l_Bitmap); Clipboard.Assign(l_Bitmap); finally l_Bitmap.Free; end; end; procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); //フォーム移動 begin ReleaseCapture; SendMessage(Self.Handle, WM_SYSCOMMAND, WPARAM(SC_SIZE or 9), 0); end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var l_Pos : TPoint; begin if not(CheckBox1.Checked) then begin GetCursorPos(l_Pos); l_Pos := ZoomBox1.ScreenToClient(l_Pos); if (PtInRect(Rect(0, 0, ZoomBox1.Width, ZoomBox1.Height), l_Pos)) then begin // ZoomBox1.OriginPosition := l_Pos; // ZoomBox1.Position := ZoomBox1.ClientToScreen(Point(0, 0)); end; end; end; procedure TForm1.FormDblClick(Sender: TObject); var lpt_Pos : TPoint; lh_Handle : THandle; begin lpt_Pos := Point(0, 0); GetCursorPos(lpt_Pos); lh_Handle := gfnhToplevelWindowGet(Point(0, 0)); //myDebug.gpcDebug(); try AttachThreadInput(gfniThreadIDGet(lh_Handle), gfniThreadIDGet(Self.Handle), True); SetForegroundWindow(lh_Handle); PostMessage(lh_Handle, WM_RBUTTONUP, 0, 0); finally AttachThreadInput(gfniThreadIDGet(lh_Handle), gfniThreadIDGet(Self.Handle), False); end; end; procedure TForm1.Button2Click(Sender: TObject); var lh_Handle : THandle; begin lh_Handle := gfnhToplevelWindowGet(Point(0, 0)); try AttachThreadInput(gfniThreadIDGet(lh_Handle), gfniThreadIDGet(Self.Handle), True); myDebug.gpcDebug( Windows.SetFocus(lh_Handle) ); // PostMessage(lh_Handle, WM_RBUTTONUP, 0, 0); myDebug.gpcDebug( SetCapture(lh_Handle) ); PostMessage(lh_Handle, WM_RBUTTONUP, MK_RBUTTON, 0); finally ReleaseCapture; AttachThreadInput(gfniThreadIDGet(lh_Handle), gfniThreadIDGet(Self.Handle), False); end; end; end.