关于鼠标钩子的问题(50分)

  • 主题发起人 主题发起人 fbzz88
  • 开始时间 开始时间
F

fbzz88

Unregistered / Unconfirmed
GUEST, unregistred user!
我在用鼠标的时候,写了一个取屏幕色的时候,在鼠标不移出Form的时候都没问题,可移出
后,就要所有应用程序关闭,请各位帮我检查一下,程序代码如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TFrmMain = class(TForm)
Label2: TLabel;
Label3: TLabel;
DisColor: TShape;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmMain: TFrmMain;
ColorHook:THandle;

function ColorHookProc(iCode: Integer; w_Param: WPARAM; l_Param: LPARAM):LRESULT;stdcall;

implementation

{$R *.dfm}

function ColorHookProc(iCode: Integer; w_Param: WPARAM; l_Param: LPARAM):LRESULT;stdcall;
var
MousePos: TPoint; //鼠标位置指针
MousePosX,MousePosY: string; //鼠标位置X轴,鼠标位置Y轴
MousePosColor,MousePosColorRed,MousePosColorGreen,MousePosColorBlue: longint; //鼠标位置颜色
MousePosColorRedH,MousePosColorGreenH,MousePosColorBlueH: string; //颜色16进制
begin
Result:=0;
if iCode<0 then //为了hook的安全此处应该判断...
begin
result := CallNextHookEx(ColorHook, iCode, w_Param, l_Param);
exit;
end;
if iCode=HC_ACTION then
begin
Result:=CallNextHookEx(0,iCode,w_Param,l_Param);
end;
Case w_Param of
WM_LBUTTONDOWN,
WM_NCLBUTTONDOWN,
WM_MBUTTONDOWN,
WM_NCMBUTTONDOWN,
WM_NCRBUTTONDOWN,
WM_RBUTTONDOWN,
WM_NCMouseMove,
WM_MOUSEMOVE:
begin
GetCursorPos(MousePos); //得到鼠标坐标
MousePosX := IntToStr(MousePos.x);
MousePosY := IntToStr(MousePos.y);
FrmMain.Caption := Format('鼠标位置:[ %s,%s ]',[MousePosX,MousePosY]);
MousePosColor := GetPixel(GetDC(0),MousePos.x,MousePos.y); //得到颜色。
MousePosColorRed := MousePosColor and $FF; //分离出红色
MousePosColorGreen := (MousePosColor and 65280) div 256; //分离出绿色
MousePosColorBlue := (MousePosColor and $FF0000) div 65536; //分离出蓝色
FrmMain.Label2.Caption := Format('RGB 颜色:[ %d,%d,%d ]',[MousePosColorRed,MousePosColorGreen,MousePosColorBlue]);
//方块显示颜色
FrmMain.DisColor.Brush.Color := RGB(MousePosColorRed,MousePosColorGreen,MousePosColorBlue);
//网页颜色16进制,不足8位的补齐8位。
MousePosColorRedH := Format('%x',[MousePosColorRed]);
if Length(MousePosColorRedH) = 1 then MousePosColorRedH := '0' + MousePosColorRedH;
MousePosColorGreenH := Format('%x',[MousePosColorGreen]);
if Length(MousePosColorGreenH) = 1 then MousePosColorGreenH := '0' + MousePosColorGreenH;
MousePosColorBlueH := Format('%x',[MousePosColorBlue]);
if Length(MousePosColorBlueH) = 1 then MousePosColorBlueH := '0' + MousePosColorBlueH;
FrmMain.Label3.Caption := Format('网页颜色:[ #%s%s%s ]',[MousePosColorRedH,MousePosColorGreenH,MousePosColorBlueH]);
end;
end;
end;


procedure TFrmMain.Button1Click(Sender: TObject);
begin
ColorHook:=SetWindowsHookEx(WH_MOUSE,ColorHookProc,hInstance,0);
end;

procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ColorHook<>0 then
UnHookWindowsHookEx(ColorHook);
end;

procedure TFrmMain.FormCreate(Sender: TObject);
begin
ColorHook:=0;
end;

end.

 
后退
顶部