请问为什么屏幕上的截图没有mouse?

atlone 2003-10-20 03:18:44
我用以下在屏幕上截图:

Graphics graphics = control.CreateGraphics();

IntPtr hDCPanel = graphics.GetHdc();
IntPtr hDCDesktop = Win32.GetDC(hWndDesktop);

Win32.StretchBlt(hDCPanel, 0, 0, 800, 600,
hDCDesktop, left, top,800 / zoomRate, 600 / zoomRate,
Win32.SRCCOPY);

graphics.ReleaseHdc(hDCPanel);

Win32.ReleaseDC(hWndDesktop, hDCDesktop);

所调用的API是这样的(在Win32 class底下):

[DllImport("Gdi32.dll")]
public static extern int StretchBlt(
IntPtr hdcDest,
int nXOriginDest,
int nYOriginDest,
int nWidthDest,
int nHeightDest,
IntPtr hdcSrc,
int nXOriginSrc,
int nYOriginSrc,
int nWidthSrc,
int nHeightSrc,
int dwRop
);

可以截图,但所截出来的图没有鼠标,请问怎样也把mouse的形状也截到图上? 谢谢.
...全文
175 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
atlone 2003-10-22
  • 打赏
  • 举报
回复
up
Bob 2003-10-22
  • 打赏
  • 举报
回复
我试了一个晚上,只想出一个不完美的方法。

1 打开系统目录下的Cursors目录,如:C:\WINNT\Cursors,用ACDSEE等
看图软件打开rainbow.ani,然后保存为gif格式,再用Photoshop处理一
下生成一张鼠标指针的gif图片。注意,背景应该是透明的。

2 把这个gif文件拷贝到程序运行的目录。

3 执行代码如下(API声明略):

//创建显示器的DC
IntPtr dc1 = CreateDC ( "DISPLAY" , null , null , ( IntPtr ) null ) ;
//由一个指定设备的句柄创建一个新的Graphics对象
Graphics g1 = Graphics.FromHdc ( dc1 ) ;

//根据屏幕大小创建一个与之相同大小的Bitmap对象
bmp = new Bitmap ( Screen.PrimaryScreen.Bounds.Width ,
Screen.PrimaryScreen.Bounds.Height , g1 ) ;
Graphics g2 = Graphics.FromImage ( bmp ) ;

//获得屏幕的句柄
IntPtr dc3 = g1.GetHdc ( ) ;
//获得位图的句柄
IntPtr dc2 = g2.GetHdc ( ) ;

//把当前屏幕捕获到位图对象中
BitBlt ( dc2 , 0 , 0 , Screen.PrimaryScreen.Bounds.Width ,
Screen.PrimaryScreen.Bounds.Height , dc3 , 0 , 0 , 13369376 ) ;

//释放屏幕句柄
g1.ReleaseHdc ( dc3 ) ;
//释放位图句柄
g2.ReleaseHdc ( dc2 ) ;

Bitmap cursor = new Bitmap(Application.StartupPath+"\\cursor.gif");
g2.DrawImage(cursor, MousePosition.X, MousePosition.Y, cursor.Width, cursor.Height);
bmp.Save("C:\\capture.jpg");

picBox1.Image = bmp;


如果要画出系统当前的鼠标指针,则会碰到指针位置与实际位置不符的问题。
什么原因呢?你打开C:\WINNT\Cursors,用ACDSEE浏览该目录下的指针文件,
我想你就会明白其中的原因了。

以下是我画系统当前鼠标指针的代码:

Rectangle rect = new Rectangle(
Cursor.Position.X, Cursor.Position.Y,
Cursor.Size.Width, Cursor.Size.Height);

Cursor.Draw(g2,rect);

Bitmap bmp2 = new Bitmap(Cursor.Size.Width, Cursor.Size.Height);
Graphics g3 = Graphics.FromImage(bmp2);
Rectangle rect2 = new Rectangle(new Point(0,0),
new Size(Cursor.Size.Width, Cursor.Size.Height));
Cursor.Draw(g3,rect2);

bmp2.Save("C:\\img.gif",ImageFormat.Gif);


我还是不明白为什么系统自己不会搞错呢?我猜一定有一种完美解决该问题
的方法,希望熟悉Window编程的高手解答!
zhongwanli 2003-10-22
  • 打赏
  • 举报
回复
T页
lgabc 2003-10-22
  • 打赏
  • 举报
回复
该方法以在vc6.0
中实现
lgabc 2003-10-22
  • 打赏
  • 举报
回复
GetCursorPos()得到当时鼠标的坐标,
再GetCursor()得到鼠标的HCURSOR。
最后把鼠标的位图拷贝到 先前抓到的位图。
拷位图时, 可以用得到的HCURSOR作为参数传到位图拷贝函数里。
lgabc 2003-10-22
  • 打赏
  • 举报
回复
GetCursorPos()得到当时鼠标的坐标,
再GetCursor()得到鼠标的HCURSOR。
最后把鼠标的位图拷贝到 先前抓到的位图。
orcale 2003-10-22
  • 打赏
  • 举报
回复
是重新劃的
Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
Private Declare Function GetCursor Lib "user32" () As Long
Private Sub Form_Paint()
DrawIcon Me.hdc, 0, 0, GetCursor
End Sub
curdle 2003-10-22
  • 打赏
  • 举报
回复
ding!!!!!!!!!!!!!
qiuji 2003-10-21
  • 打赏
  • 举报
回复
这边还有一个方法,也是获得鼠标后然后再画到图片上的。
(....you can obtain a handle to the current cursor and then use the DrawIcon() API to draw it into the screen capture at the appropriate coordinates. )

http://support.microsoft.com/default.aspx?scid=kb;en-us;230495
atlone 2003-10-21
  • 打赏
  • 举报
回复
qiuji(忆秋季) ,我根据你的提示写成以下:

}
Bitmap b=new Bitmap(800,600);
graphics = Graphics.FromImage(b);
graphics.DrawImage(b,new Rectangle(10,10,b.Width,b.Height));

Win32.DrawIconEx((int)b.GetHicon(),0,0, Win32.GetCursor(), 10,10, 0, 0, 0);
}

{
[DllImport("user32.dll")]
public static extern int GetCursor();

}

compile是通过了,但还是没有mouse出现,是不是因为DrawIconEx里面的参数设置错误?
qiuji 2003-10-21
  • 打赏
  • 举报
回复
可以不用GetCurrentCursorHandle(),
你调用API函数:GetCursor()或者GetCursorInfo()
atlone 2003-10-21
  • 打赏
  • 举报
回复
qiuji(忆秋季),我用以下来运行你的例子:

}
Bitmap b=new Bitmap(800,600);
graphics = Graphics.FromImage(b);
graphics.DrawImage(b,new Rectangle(10,10,b.Width,b.Height));

DrawIconEx(b.GetHicon(),0,0, GetCurrentCursorHandle(), 0,0, 0, 0, DI_DEFAULTSIZE);
}

HCURSOR GetCurrentCursorHandle()
{
......
}

但是就提示HCURSOR缺少using指令,HCURSOR是一个类吗?
daou101 2003-10-21
  • 打赏
  • 举报
回复
gz
atlone 2003-10-21
  • 打赏
  • 举报
回复
up
atlone 2003-10-21
  • 打赏
  • 举报
回复
谢谢,我看能不能运行.
rgbcn 2003-10-20
  • 打赏
  • 举报
回复
gz
qiuji 2003-10-20
  • 打赏
  • 举报
回复
我现在用的机器上没有安装VS.NET,所以不能给你一个准确的例子。
你可以参考一下下面的例子:
(这是使用delphi实现的,在C#中原理类似)
use the API DrawIconEx( ) to draw an Cursor to a bitmap:

begin
hCursor := GetCursor;
CopyBmp := TBitmap.Create;
CopyBmp.Width := 32;
CopyBmp.Height := 32;
DrawIconEx(CopyBmp.Canvas.Handle,0,0, hCursor, 0,0, 0, 0, DI_DEFAULTSIZE or DI_NORMAL);
Canvas.Draw(20,20,CopyBmp);
CopyBmp.SavetoFile('C:\SomeBmp.bmp');
CopyBmp.Free;
end;
atlone 2003-10-20
  • 打赏
  • 举报
回复
AhBian(阿扁):
你的方法我试过了,还是一样.

qiuji(忆秋季) :
你那个DrawIconEx是怎么用的?可以举个例子吗? 还有如果由于文件运行而导致的mouse形状改变,怎么办呢?

AhBian 2003-10-20
  • 打赏
  • 举报
回复
To qiuji(忆秋季):
请问:
难道像 ACDSee 这类看图软件里的“包含鼠标指针的屏幕截图”功能
是按照类似于你的方法实现的吗?
qiuji 2003-10-20
  • 打赏
  • 举报
回复
调用API函数DrawIconEx(),来画鼠标。
[DllImport("user32.dll", EntryPoint="DrawIconEx")]
private static extern int DrawIconEx (
int hdc,
int xLeft,
int yTop,
int hIcon,
int cxWidth,
int cyWidth,
int istepIfAniCur,
int hbrFlickerFreeDraw,
int diFlags
);
加载更多回复(8)
对整threeJS体系进行全面剖析。整理出全面的教学大纲,涵盖内容面非常广。此教学版本为threeJS107版本。关于版本不建议大家使用低于90的版本学习。以下是课程目录1-ThreeJS概览(基本图形简介,什么是点线面如何绘制点线面,什么是材质,什么是几何体,什么是相机,什么是渲染器,什么是场景)2-相机和渲染器(详解相机类型,渲染器如何使用,针对不同场景怎么用,怎么调效果,怎么渲染,怎么输出画布,如何解决透明问题等等)3-创建平面几何(常见的几何体如何使用,如何使用简单的几何体绘制出自定义自己想要的几何体,关于几何体的性能剖析,如何解决性能,几何体的渲染原理)4-高级图形算法常见库(求直线的斜率  计算线段与圆的交点 计算线段的长度 判断折线是否在多边形内 等等)5-sprite精灵(怎么让一个图标永远朝向屏幕,精灵的属性,精灵材质原理等,广告提示框必用)6-骨骼游戏动画(什么是模型动画,常见游戏案例,如何让人头进行各种攻击动作)7-3d模型加载(常见模型格式,如何渲染不同格式,不同格式的特点,什么格式性能优越,模型渲染异常,贴图不显示等问题详解)8-高阶动态纹理(你所不知道的纹理用法,我说你不知道,你肯定不知道)9-漫游轨迹以及其动画路径(怎么绘制贝塞尔曲线,如何使用曲线上的路径,跟随路径移动的原理,相机如何运动,物体如何运动)10-着色器(什么是着色器。初识着色器基础,着色器材质怎么用,怎么使用着色器库)11-常见渲染以及透明度问题12-对象拾取以及拖拽(3d世界里面如何拖拽物体,拖拽的原理,mousemove mouseon等的事件效果)13-世界坐标以及组的问题(什么是相对坐标,什么是世界坐标,什么是当前坐标,怎么转化父子坐标系,组的优化,为什么用组,组的优势)14-指定对象旋转中心(什么是物体的几何体中心,如何改变中心,如何绕轴转动)15-层级对象渲染(多个场景一键切换,切换的优势,针对大项目的用法)16-拓展了解系列(不定期不断更新案例,各种酷炫效果bloom,halo等,以及各种3d图表,粒子案例等,不断构建你的3d实践能力)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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