如何在调用外部程序后,当这个外部程序为当前窗口时,限制鼠标在其窗口内部 ( 积分: 100 )

  • 主题发起人 主题发起人 mr.hl
  • 开始时间 开始时间
M

mr.hl

Unregistered / Unconfirmed
GUEST, unregistred user!
奉上100分,如果觉得这点分不够,我再加.关键请大家帮我解决!谢了

如何在调用外部程序(a.exe)后,当这个外部程序a.exe为当前窗口时,限制鼠标在其窗口内部,不让鼠标能移到外面区域.

如果是其他程序窗口在前的话,鼠标就是正常的.能做到吗?

//我做的是个调用 魔兽争霸 的窗口模式后,想把鼠标限制在这个窗口内部.
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
H: HWND;
R: TRect;
begin
H := GetForegroundWindow;
if (H > 0) and (H = AHandle) then //AHandle指调用的 魔兽争霸 的窗口Handle
begin
if GetWindowRect(H, R) then ClipCursor(@R);
end
else ClipCursor(nil);
end;
 
嗯!方法基本可行.
var
H: HWND;
R: TRect
是不是该: H: Thandle;
这样才行.还有,我试了下,好像限制的区域是最外面的边框,而我需要限制在最上面那个边减去几十像素的距离,左边右边下面的边减去几像素的区域(因为窗口有点边缘),就是说我要限制的区域比窗口略小一点.应该怎么做呢?
我修改了你的程序:
if GetWindowRect(H, R) then
begin
R.Top:=R.Top+26;
R.Left:=R.Left+5;
R.Right:=R.Right-5;
R.Bottom:=R.Bottom-5;
ClipCursor(@R);
end;
有没有更好的方法?就是说让程序自己判断区域大小?
 
HWND 与 THandle都是LongWord,应该都可以吧

var
P: TPoint;
R: TRect;
begin
if Windows.GetClientRect(H, R) then //获取客户区大小,不含标题栏及边框
begin
P := R.TopLeft; //取左上角
Windows.ClientToScreen(H, P); //转换成屏幕坐标
OffsetRect(R, P.X, P.Y); //移动Rect,相当于转换成屏幕坐标
end;
end;

加入Windows.是因为TForm也有GetClientRect及ClientToScreen procedure
 
太感谢了!
Success!
 
后退
顶部