Delphi 如何在控件内更改鼠标光标?
我有一个类似于团队视图软件的远程访问,我想根据“受控”部分的鼠标图标更改鼠标光标(换句话说,在“控制器”部分,服务器端),就像在团队视图软件中一样 我的软件使用的是Delphi 如何在控件内更改鼠标光标?,delphi,Delphi,我有一个类似于团队视图软件的远程访问,我想根据“受控”部分的鼠标图标更改鼠标光标(换句话说,在“控制器”部分,服务器端),就像在团队视图软件中一样 我的软件使用的是TPaintBox,因为我需要将其他必要的东西制作成TPaintBox,以便正常工作 tpainbox将crDefault作为默认光标。只有当鼠标位于tpaitbox内时,我才能更改此选项(在“控制器”部分) 是用于在“受控”部分(客户端)捕获鼠标图标的代码 这是我的代码,到目前为止,我一直在尝试更改“控制器”部分(服务器端)中鼠标的
TPaintBox
,因为我需要将其他必要的东西制作成TPaintBox
,以便正常工作
tpainbox
将crDefault
作为默认光标。只有当鼠标位于tpaitbox
内时,我才能更改此选项(在“控制器”部分)
是用于在“受控”部分(客户端)捕获鼠标图标的代码
这是我的代码,到目前为止,我一直在尝试更改“控制器”部分(服务器端)中鼠标的图标:
欢迎所有建议。如果您想更改代码中的光标,以下操作将起作用
//Context: Timer.Interval = 50; :-)
procedure TForm57.Timer1Timer(Sender: TObject);
var
p: TPoint;
begin
if Ord(PaintBox1.Cursor) < Ord(crSizeAll) then PaintBox1.Cursor:= crArrow
else PaintBox1.Cursor:= Pred(PaintBox1.Cursor);
//Force Windows to change the cursor by sending a WM_SETCURSOR message.
PaintBox1.Parent.Perform(WM_SETCURSOR, PaintBox1.Parent.Handle, MakeLParam(HTCLIENT, WM_MOUSEMOVE));
(** //if you're viewing using a slow remote connection you make need to do this:
//Wiggle the mouse to force cursor change.
GetCursorPos(p);
SetCursorPos(p.x-1, p.y);
Sleep(100); //needed on slow remote connection.
SetCursorPos(p.x, p.y); (**)
end;
如果您在远程连接上,那么客户端远程端可能会缓存光标。在这种情况下,您可能需要将其向一侧摆动,Sleep(100)
并将其向后摆动,以便客户端软件检测鼠标移动并强制刷新光标
如果您只希望画框
中的光标是静态的,但与应用程序的其他部分不同,那么这就可以正常工作:
使用PaintBox的onMouseCenter和OnMouseLeave事件。您尝试的代码有什么问题,怎么会失败?提出一个关于在客户端和服务器之间发送实时消息的新问题。我希望您同意我已经回答了您关于如何更改光标的问题。(所以不允许在一篇帖子里问两个问题)。这很奇怪。您正在代码中设置游标属性。你接受的答案也是如此。我想知道你的问题是什么。你不需要晃动鼠标。可以用
PaintBox1.Parent.Perform(WM_SETCURSOR,PaintBox1.Parent.Handle,MakeLParam(HTCLIENT,WM_MOUSEMOVE))替换最后三行
@Johan,我只想在客户端告诉我光标被更改时更改光标(在服务器端),将实际光标发送到服务器端的lblPoint
(TLabel),根据这个TLabel
,我可以在服务器端更改客户端显示的实际光标:-)我听不懂你在说什么。除非您正在进行VLC,否则服务器和客户端都有自己的鼠标和光标。如果你说的是在客户机和服务器之间发送消息,那是另一个问题。@Johan,是的,客户机将实际光标发送到服务器,我希望将服务器的光标更改为等于客户机光标。因此,将服务器的光标更改为等于客户机光标。哪一部分你不能做。
//Context: Timer.Interval = 50; :-)
procedure TForm57.Timer1Timer(Sender: TObject);
var
p: TPoint;
begin
if Ord(PaintBox1.Cursor) < Ord(crSizeAll) then PaintBox1.Cursor:= crArrow
else PaintBox1.Cursor:= Pred(PaintBox1.Cursor);
//Force Windows to change the cursor by sending a WM_SETCURSOR message.
PaintBox1.Parent.Perform(WM_SETCURSOR, PaintBox1.Parent.Handle, MakeLParam(HTCLIENT, WM_MOUSEMOVE));
(** //if you're viewing using a slow remote connection you make need to do this:
//Wiggle the mouse to force cursor change.
GetCursorPos(p);
SetCursorPos(p.x-1, p.y);
Sleep(100); //needed on slow remote connection.
SetCursorPos(p.x, p.y); (**)
end;
procedure TForm57.PaintBox1MouseEnter(Sender: TObject);
begin
if .... then PaintBox1.Cursor:= crIBeam
else if .....
PaintBox1.Parent.Perform(WM_SETCURSOR, PaintBox1.Parent.Handle, MakeLParam(HTCLIENT, WM_MOUSEMOVE));
end;