如何将当前使用的光标保存到流(资源或文件)中?

Posted

技术标签:

【中文标题】如何将当前使用的光标保存到流(资源或文件)中?【英文标题】:How can I save currently used cursor into the stream (resource or file)? 【发布时间】:2011-08-04 11:43:38 【问题描述】:

有谁知道如何将光标(当前由我的应用程序使用,即使它是自定义的或动画的)保存到流或文件中,以便我能够通过网络将其发送到加载我的应用程序的另一台计算机并使用它?简单地说,我想从远程计算机克隆光标。

正如我在this article 中发现的,大多数图标功能也可以用于光标,但我找不到任何易于翻译的示例。 Here's 一个使用 COM 的示例,但我不确定 IPicture 接口是否也可用于游标。 Here 例如是关于将图像保存到 *.cur 文件中的讨论,但我找不到任何适合将光标保存和加载到流、资源或我可以通过网络发送和加载的东西在目标计算机上。

附: might expect 没有 SaveCursorToFile 函数。

感谢您的任何建议

【问题讨论】:

我怀疑它是否可能。听起来您正在做一个远程访问系统(我知道,现在我是 Clippy,是吗?) - 您可以使用 Nexxus SupportMe 或Delphi 的 Nexxus 门户组件。 nexusdb.com/support/index.php 【参考方案1】:

看看这里:IconsToFile.pas。

这也保存了(静态)游标。可以通过以下方式进行测试:

hIconToFile('C:\Temp\Demo.cur', GetCursor, BitC32);

有效。不过,您可能必须调整比特率。我认为动画光标会有问题,但可能足以让您入门。

【讨论】:

【参考方案2】:

我认为DrawIconEx 可能有助于解决此问题。有了它,您可以简单地将整个光标图像绘制到某个画布上。也可以通过将其索引传递给 istepIfAniCur 参数来绘制指定的动画光标框。以下示例展示了如何将当前光标保存到流中 (Button1Click) 并将其加载回来并显示 (Button2Click)。

另一个问题是how to detect if the cursor is animated。

var
  Stream: TMemoryStream;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Stream := TMemoryStream.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Stream.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Picture: TPicture;
  CursorInfo: TCursorInfo;
begin
  Picture := TPicture.Create;

  CursorInfo.cbSize := SizeOf(CursorInfo);
  GetCursorInfo(CursorInfo);

  Picture.Bitmap.Transparent := True;
  Picture.Bitmap.Width := GetSystemMetrics(SM_CXCURSOR);
  Picture.Bitmap.Height := GetSystemMetrics(SM_CYCURSOR);

  DrawIconEx(
              Picture.Bitmap.Canvas.Handle, // handle to the target canvas
                                         0, // left coordinate
                                         0, // top coordinate
                        CursorInfo.hCursor, // handle to the current cursor
                                         0, // width, 0 for autosize
                                         0, // height, 0 for autosize
                                         0, // animated cursor frame index
                                         0, // flicker-free brush handle
                                  DI_NORMAL // flag for drawing image and mask
            );

  Picture.Bitmap.SaveToStream(Stream);
  Picture.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Picture: TPicture;
begin
  Stream.Position := 0;

  Picture := TPicture.Create;
  Picture.Bitmap.Transparent := True;
  Picture.Bitmap.Width := GetSystemMetrics(SM_CXCURSOR);
  Picture.Bitmap.Height := GetSystemMetrics(SM_CYCURSOR);
  Picture.Bitmap.LoadFromStream(Stream);

  SetBkMode(Canvas.Handle, TRANSPARENT);
  Canvas.FillRect(Rect(0, 0, 32, 32));
  Canvas.Draw(0, 0, Picture.Graphic);

  Picture.Free;
end;

【讨论】:

以上是关于如何将当前使用的光标保存到流(资源或文件)中?的主要内容,如果未能解决你的问题,请参考以下文章

将光标更改为自定义光标图像作为资源

如何将视频文件保存到自定义资源库?

如何将 Drawable 保存在资源文件夹中?

VC中如何将添加到资源的文件保存到目标位置?

Delphi资源文件(全面分析之位图光标图标AVIJPEGWave)

如何将可绘制资源中的图像保存到 SD 卡?