首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PrintScreen后剪贴板上没有图像

PrintScreen后剪贴板上没有图像
EN

Stack Overflow用户
提问于 2013-09-20 11:04:29
回答 4查看 1.4K关注 0票数 1

我正在实现不同的屏幕抓取来比较它们。其中一个应该使用“printscreen”键和剪贴板。

我用keybd_event发送击键

代码语言:javascript
运行
复制
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void keybd_event(byte vVK, byte bScan, int dwFlags,int dwExtraInfo);

public const int KEYEVENTF_EXTENDEDKEY=0x0001; //key down
public const int KEYEVENTF_KEYUP=0x0002; //key up

public const int VK_SNAPSHOT=0x2C; //VirtualKey code for print key

public static void PrintScreen(){
keybd_event(VK_SNAPSHOT,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(VK_SNAPSHOT,0,KEYEVENTF_KEYUP,0);
}

在我的IEnumerable中,我调用这个方法,然后尝试获取图像:

代码语言:javascript
运行
复制
...
InputController.PrintScreen();
var img=Clipboard.GetImage();
...

返回的图像始终为null,而Clipboards.ContainsImage()始终为false。我已经试过在发送钥匙后等一会儿,但它也不起作用。我是遗漏了某种设置,还是有根本错误?

PS:在运行程序后,我能够将正确的图像粘贴到油漆或剪贴画中。

EN

Stack Overflow用户

发布于 2014-07-28 17:14:16

我知道这是一个更老的问题,但我想我会分享我的发现,因为它是与此相关的。我看到的问题是,只要代码中有断点,上面发布的方法就能工作。如果没有断点,事件就会触发,但只有在退出方法调用之后才会触发。

这意味着

代码语言:javascript
运行
复制
    InputController.PrintScreen();
    var img=Clipboard.GetImage();

因为剪贴板在离开这个方法之前是不会被填充的。这是一个使用DoEvents()的老VB技巧。这将允许我们的应用程序处理队列中的所有windows消息。因此,修改后的代码应该有效。

代码语言:javascript
运行
复制
    InputController.PrintScreen();
    Application.DoEvents();
    var img=Clipboard.GetImage();
票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18915209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档