我正在实现不同的屏幕抓取来比较它们。其中一个应该使用“printscreen”键和剪贴板。
我用keybd_event发送击键
[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中,我调用这个方法,然后尝试获取图像:
...
InputController.PrintScreen();
var img=Clipboard.GetImage();
...返回的图像始终为null,而Clipboards.ContainsImage()始终为false。我已经试过在发送钥匙后等一会儿,但它也不起作用。我是遗漏了某种设置,还是有根本错误?
PS:在运行程序后,我能够将正确的图像粘贴到油漆或剪贴画中。
发布于 2014-07-28 17:14:16
我知道这是一个更老的问题,但我想我会分享我的发现,因为它是与此相关的。我看到的问题是,只要代码中有断点,上面发布的方法就能工作。如果没有断点,事件就会触发,但只有在退出方法调用之后才会触发。
这意味着
InputController.PrintScreen();
var img=Clipboard.GetImage();因为剪贴板在离开这个方法之前是不会被填充的。这是一个使用DoEvents()的老VB技巧。这将允许我们的应用程序处理队列中的所有windows消息。因此,修改后的代码应该有效。
InputController.PrintScreen();
Application.DoEvents();
var img=Clipboard.GetImage();https://stackoverflow.com/questions/18915209
复制相似问题