【问题标题】:c++ Program to take a screenshotc++截屏程序
【发布时间】:2014-07-27 20:23:54
【问题描述】:

我正在制作一个可以点击键盘的 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

由于某种原因,代码无法正常工作。如果我去绘画并尝试从剪贴板绘画,它只会超过我在使用我的程序之前所做的任何打印屏幕。此外,我的键盘不需要我在打印屏幕上按“alt”即可工作..

我曾尝试将 Alt 键的按下包括在 printscreen 键的按下之前,以及 Alt 键的释放以及 printscreen 键的释放,而我得到的不同之处在于,当我尝试把它涂在油漆上,我画了一个全黑屏……这只是我做的一个测试,看看它是否有区别,但我的实际键盘只需要点击打印屏幕按钮就可以截取屏幕截图。

关于我做错了什么有什么想法吗?

编辑: 只是为了让你们知道,该程序确实可以编译。我还添加了将剪贴板文件保存到目录的其他代码,如果我手动点击打印屏幕按钮,我会正确保存文件......但是如果我继续循环保存到目录的代码,同样的图片出现手动获取的屏幕截图...所以我确定点击打印屏幕按钮有问题。

【问题讨论】:

  • 那些函数调用成功了吗?如果您不费心检查,那是您应该做的第一件事。文件清楚地说明了条件。无论如何,鉴于可以以编程方式截取屏幕截图,您不应该按键。
  • 是的,他们确实成功了。该程序编译完美。事实上,我在这个程序后面还有另一个代码,它实际上制作了一个 png 文件......它工作得很好......但它一直在制作我手动执行的屏幕截图的 png 文件......例如,如果我截取屏幕截图...... .. 然后我在不同颜色的屏幕上运行 te 程序...导出的文件将是我的第一个手动完成的屏幕截图...并且它将一直是手动截取的屏幕截图,直到我再次手动屏幕截图。
  • "是的,他们确实成功了。程序编译完美。" - 编译并不意味着在运行时成功...您应该检查返回的值 ala int result = SendInput(...); if (result != 1) { ... 使用 GetLastError() 找出它失败的原因 ...};
  • @rsthegreat12:是你应该搁置任何更雄心勃勃的项目(比如,呃,截屏)并返回基本教程的地方,比如,呃,检查返回值...无意冒犯,人们在掌握基本知识之前就跳入“有趣”是很常见的。

标签: c++ screenshot printscreen


【解决方案1】:

在windows平台上: 您必须遵循一定的模拟按键顺序。

下面的代码是模拟keybd_event()的键盘事件,并将截取的屏幕放入剪贴板。

#include <iostream>
#include <windows.h>
using namespace std;



int main()
{
    keybd_event(VK_MENU, 0, 0, 0); //Alt Press
    keybd_event(VK_SNAPSHOT, 0, 0, 0); //PrntScrn Press


    keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0); //PrntScrn Release
    keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0); //Alt Release

return 0;
}

【讨论】:

    【解决方案2】:

    这是在 BMP 中截屏并将其转换为 JPG 的代码:

    void TakeScreenShot(const std::string& path)
    {
    //setting to the screen shot
    keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
    keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    
    //handler of the bitmap that save the screen shot
    HBITMAP hBitmap;
    
    //I have to give for it time to make it work
    Sleep(100);
    
    //take the screen shot
    OpenClipboard(NULL);
    
    //save the screen shot in the bitmap handler 
    hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
    
    //relese the screen shot
    CloseClipboard();
    
    std::vector<BYTE> buf;
    IStream *stream = NULL;
    HRESULT hr = CreateStreamOnHGlobal(0, TRUE, &stream);
    CImage image;
    ULARGE_INTEGER liSize;
    
    // screenshot to jpg and save to stream
    image.Attach(hBitmap);
    image.Save(stream, Gdiplus::ImageFormatJPEG);
    IStream_Size(stream, &liSize);
    DWORD len = liSize.LowPart;
    IStream_Reset(stream);
    buf.resize(len);
    IStream_Read(stream, &buf[0], len);
    stream->Release();
    
    // put the imapge in the file
    std::fstream fi;
    fi.open(path, std::fstream::binary | std::fstream::out);
    fi.write(reinterpret_cast<const char*>(&buf[0]), buf.size() * sizeof(BYTE));
    fi.close();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 2010-10-19
      • 2011-01-10
      • 1970-01-01
      相关资源
      最近更新 更多