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

时间:2011-08-04 11:43:38

标签: delphi winapi cursor

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

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

P.S。你might expect没有SaveCursorToFile函数。

感谢您的任何建议

2 个答案:

答案 0 :(得分:2)

看看这里:IconsToFile.pas

这也可以保存(静态)游标。可以测试:

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

作品。您可能需要调整比特率。我认为动画游标会有问题,但可能足以让你开始。

答案 1 :(得分: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;