Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在控件内更改鼠标光标?_Delphi - Fatal编程技术网

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;