众所周知,有时开发人员必须记录内容.或者捕获一些用于提交错误报告的内容.
我的问题是在MS Windows中.
我正在尝试捕获应用程序的几个区域的上下文菜单(右键单击项目后出现的弹出菜单).按下Alt以启动Alt+ PrintScreen进程将关闭上下文菜单.
(只有按下有PrintScreen帮助,但每次删除非窗口区域都很痛苦).
奖励:要捕获菜单,Alt还要关闭菜单.但是,如果您首先使用该Alt键打开菜单,它的工作原理如下:
使用Print Screen+ Alt键组合手动捕获窗口时,我得到以下内容:

但如果我尝试使用Windows API以编程方式执行此操作,我会得到:

为什么会出现差异?我如何以编程方式获得第一个?
这是我的代码:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags);
public Bitmap PrintWindow()
{
Bitmap bmp = new Bitmap(windowRect.Width, windowRect.Height, PixelFormat.Format32bppArgb);
Graphics gfxBmp = Graphics.FromImage(bmp);
IntPtr hdcBitmap = gfxBmp.GetHdc();
bool success = PrintWindow(windowHandle, hdcBitmap, 0);
gfxBmp.ReleaseHdc(hdcBitmap);
if (!success)
{
Console.WriteLine("Error copying image");
Console.WriteLine(getLastError());
}
gfxBmp.Dispose();
return bmp;
}
Run Code Online (Sandbox Code Playgroud)
更新: 使用BitBlt做同样的事情.
这是来自CodeProject的代码,它仍然返回一个黑色蒙版图像:
public Image CaptureWindow(IntPtr handle)
{
// get te hDC of …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用打印屏幕图像区域来获得2个显示器,但仅适用于一个显示器.你能告诉我如何获得2号显示器吗?
Robot robot = new Robot();
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = new Robot().createScreenCapture(screenRect);
ImageIO.write(capture, "bmp", new File("printscreen.bmp"));
Run Code Online (Sandbox Code Playgroud) 如何在WPF应用程序运行时禁用"打印屏幕"功能?
用例是我的客户希望避免不必要地复制来自外部世界的有价值的以患者为中心的数据,并且它们提供物理安全性以防止人们通过非数字手段获取数据.
如何打印屏幕最小化的窗口?我相信这是可能的,因为Windows任务栏可以创建窗口的预览,即使它被最小化.
我正在制作一个程序,它将点击键盘的printscreen键.我使用的代码如下:
INPUT myInput;
myInput.type = INPUT_KEYBOARD;
KEYBDINPUT keyboardInput;
keyboardInput.wScan = 0;
keyboardInput.dwFlags = 0;
keyboardInput.time = 0;
keyboardInput.dwExtraInfo = 0;
keyboardInput.wVk = VK_SNAPSHOT;
myInput.ki = keyboardInput;
SendInput(1, &myInput, sizeof(INPUT));//pressing the printscreen key
keyboardInput.dwFlags = KEYEVENTF_KEYUP;
myInput.ki = keyboardInput;
SendInput(1, &myInput, sizeof(INPUT));//releasing the printscreen key
Run Code Online (Sandbox Code Playgroud)
由于某种原因,代码不能正常工作.如果我去绘画并试图从剪贴板中进行paist,那么它只会通过我在使用我的程序之前所做的任何打印屏幕.另外我的键盘不需要我用打印屏幕按"alt"以使其工作..
我曾尝试按下Alt键,按下打印屏幕键,以及释放Alt键,释放打印屏幕键,我得到的差异是当我试图通过它时油漆,我是一个完整的黑色屏幕...这只是我做的一个测试,看看它是否有所作为,但我的实际键盘仅截取打印屏幕按钮的截图.
关于我做错了什么人的任何想法?
编辑:只是为了让你们知道,该程序确实编译.我还添加了其他代码,将剪贴板文件保存到目录中,如果我手动点击打印屏幕按钮,我会正确保存文件...但是如果我继续循环这段代码并保存到目录,则相同的图片手动获取的屏幕截图显示...这就是我如何确定打印屏幕按钮的打击有问题.
如何以编程方式在Linux中截取应用程序的屏幕截图?我正在使用c ++.任何的想法?对于Windows,有很多资源,但我找不到任何Linux的东西
有帮助吗?谢谢
我有点挑战.
在我们产品的早期版本中,我们有一个错误消息窗口(最后的手段,未处理的异常),它显示了异常消息,类型,堆栈跟踪+各种信息.
这个窗口是打印屏幕友好的,因为如果用户只是做了一个打印屏幕捕获,并通过电子邮件发送给我们屏幕截图,我们几乎拥有了开始诊断问题所需的一切.
然而,对于普通用户来说,这种形式被认为过于技术性和"可怕",所以它被归结为一个更友好的形式,仍然显示错误信息,但不是堆栈跟踪和一些更残酷的细节,我仍然喜欢搞定.此外,该表格还增加了向我们发送电子邮件的功能,其中包含我们之前拥有的所有内容以及许多其他技术细节,基本上我们需要的一切.
但是,用户仍然使用PrintScreen来捕获表单的内容并将电子邮件发送给我们,这意味着我现在的信息量不会超过最佳状态.
所以我很想知道.我是否有可能预先渲染一个与我的表格大小相同的位图,我需要的一切,检测到PrintScreen被击中,并在捕获之前用我的位图快速换出表单内容,然后再返回?
在你说"只是教育用户"之前,是的,那是行不通的.这些不是用户,他们是我们客户的用户,所以我们真的不能告诉他们这么多.
或者,除此之外,有没有办法让我检测PrintScreen,告诉Windows忽略它,然后通过将一个前面提到的预渲染位图转储到剪贴板上准备好放入电子邮件来对它作出反应?
代码是.NET 3.5中的C#3.0,如果它很重要,但是要查看/ for的东西的指针就足够了.
我们的错误报告窗口具有以下功能:
我们仍然会收到一些用户的截图.不是全部,请注意,所以我的问题基本上是如何让PrintScreen按钮为那些仍在使用它的用户提供更多帮助.
我正在使用第三方屏幕捕获应用程序 (Screenpresso)。它被配置为当我按下 时开始屏幕捕获PrtSc。确实它可以工作,除非Intellij 具有 Windows 焦点。事实上,要截屏代码,我必须专注于任何其他窗口按下PrtSc,然后选择 Intellij 中的区域。
我查看了所有设置,尤其是 Keymap 设置,但看不到任何其他已分配给PrtSc. 当然,我不太确定。当我尝试通过以下方式查找设置时
没有任何反应,因为按下PrtSc没有效果。
我知道这在以前版本的 Intellij 中对我有用(尽管我不记得是什么版本)。但PrtSc曾经像其他所有应用程序一样在 Intellij 中工作。
所以我想问题是,为什么Intellij 会吃掉PrtSc按键事件?我可以关闭它以便事件正确传递到我的专用屏幕捕获应用程序。
Intellij 2019.2.4 Windows 10、64b
如何制作我的java应用程序的打印屏幕?
saveScreen.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
...
}
});
Run Code Online (Sandbox Code Playgroud) printscreen ×10
screenshot ×3
windows ×3
c# ×2
java ×2
api ×1
awtrobot ×1
bug-tracking ×1
c++ ×1
detect ×1
jbutton ×1
linux ×1
sql-server ×1
unix ×1
winapi ×1
wpf ×1