VB.net Graphics画在屏幕上的图像,如何再次使用Graphics.fromscreen截图

MIAIONE 2019-09-06 07:12:16
如题,因为我在截图的时候并不会把这个东西截图进去,有什么方法?如果有更高级的方法指明一下,不要外挂dll和第三方库,就是直接在屏幕上画一张照片(居中,而且这张图片就是截的图),然后再次截图的时候,把画出来的和原先的桌面,其所有窗口也一起截上(就是人眼看到的),因为我在使用标题上面的那个方法时,画的速度太慢,而且经常会死机,请各位高手帮忙一下。 最好贴一下代码。
...全文
437 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
朱万里 2019-09-14
  • 打赏
  • 举报
回复
个.net调用dll[win32]中非常奇怪的问题

dll是用Delphi7.0写的一个COM组件。用VB.NET调用是出现了堆损坏的异常。但能返回正确的结果。
代码如下
procedure TMyComObj.GetText(Dir,FileNameCol : PWideChar);
var s : string;
ss : Widestring;
i ,Len : integer;
p : ^Widestring;
begin
s := XXXXX(Dir); //XXXXX是个返回字符串的函数
ss := s;
Len := length(ss);
p := Pointer(FileNameCol);
for i :=1 to Len do
begin
p^ := ss[i];
Inc(p)
end;
end;
在VB.NET先给FileNameCol预分配了一兆空间
做了如下处理
FileNameCol=“aa”
for i=1 to 19
FileNameCol=FileNameCol & FileNameCol
next

在VB中调用这个MyComObj.GetText方法时出现了“堆损坏”的异常,但FileNameCol取回的值是正确的。

但是在COM组件作如下改进就不会出现这个异常
首先在这个接口实现类中定义一个 Private Ps : ^Widestring;
然后在接口中加入如下两个方法
ALLocaMemory(Len : LongWord)
FreeMeMory(Len : LongWord)
实现代码如下
procedure TMyComObj.ALLocaMemory(Len : LongWord);
begin
Ps :=ALLocMem(2*Len)
end;

procedure TMyComObj.FreeMemory(Len : LongWord);
begin
FreeMem(Ps,2*Len)
end;

对 GetText(Dir,FileNameCol : PWideChar)方法作如下修改:

procedure TMyComObj.GetText(Dir,FileNameCol : PWideChar);
var s : string;
ss : Widestring;
i ,Len : integer;
p,pa,pb : ^Widestring;
begin
s := XXXXX(Dir); //XXXXX是个返回字符串的函数
ss := s;
Len := length(ss);
p := Pointer(FileNameCol);
pa := Pointer(Ps);
pb := pa;
//下面这段代码是将ss逐字符写到Ps指向的内存块中(通过ALLocaMemory为Ps分配内存)
for i :=1 to Len do
begin
pa^ := ss[i];
Inc(pa)
end;
//下面这段代码是将Ps指向的内存块中内容复制到FileNameCol
for i :=1 to Len do
begin
p^ := pb^;
Inc(pb);
Inc(pb);
end;
end;

在VB.NET先调用ALLocaMemory,然后调用GetText,最后调用FreeMemory。
能返回正确字符串,且不出现异常。
对此问题我百思不得其解,因此请教高手解答






橘子皮... 2019-09-14
  • 打赏
  • 举报
回复
FastCopySreen 是什么鬼
MIAIONE 2019-09-13
  • 打赏
  • 举报
回复
不知道行不行 Dim slp As Double = 1000 '决定休眠时间。 Dim temp1 As Screen = My.Computer.Screen Dim a As New Bitmap(temp1.WorkingArea.Size.Width, temp1.WorkingArea.Size.Height) Dim aaa As Graphics = Graphics.FromHdc(GetWindowDC(GetDesktopWindow())) Dim aaab As Graphics = Graphics.FromImage(a) Dim sa As New Point(0, 0) Do Try                slp -= 0.5                If slp <= 0 Then                    slp = 1                End If                aaab.FastCopySreen()                Dim Hicon As IntPtr = a.GetHicon()                aaa.DrawIcon(Icon.FromHandle(Hicon), New Rectangle With {                    .Width = temp1.WorkingArea.Width * 0.9,                    .Height = temp1.WorkingArea.Height * 0.9,                    .X = temp1.WorkingArea.Width * 0.05,                    .Y = temp1.WorkingArea.Height * 0.05                             })                Threading.Thread.Sleep(slp)                aaab.Dispose()                a.Dispose()              a = New Bitmap(temp1.WorkingArea.Size.Width, temp1.WorkingArea.Size.Height)                aaab = Graphics.FromImage(a)            Catch                aaa.Dispose()                aaab.Dispose()                a.Dispose()                Threading.Thread.Sleep(10000)                GoTo To2DWorld End Try Loop
MIAIONE 2019-09-13
  • 打赏
  • 举报
回复
引用 2 楼 橘子皮zzz 的回复:
我也想知道 Graphics画在屏幕上的图像,这个能发下看下么
Sorry,我也想,但是我觉得应该是句柄的问题了
橘子皮... 2019-09-10
  • 打赏
  • 举报
回复
我也想知道 Graphics画在屏幕上的图像,这个能发下看下么
MIAIONE 2019-09-06
  • 打赏
  • 举报
回复
引用 楼主 QEVM的回复:
如题,因为我在截图的时候并不会把这个东西截图进去,有什么方法?如果有更高级的方法指明一下,不要外挂dll和第三方库,就是直接在屏幕上画一张照片(居中,而且这张图片就是截的图),然后再次截图的时候,把画出来的和原先的桌面,其所有窗口也一起截上(就是人眼看到的),因为我在使用标题上面的那个方法时,画的速度太慢,而且经常会死机,请各位高手帮忙一下。 最好贴一下代码。
如果使用和题目一样的方法,只会反复截没有那个图片的桌面,最终结果还是一张桌面

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧