代码之家  ›  专栏  ›  技术社区  ›  rsthegreat12

c++程序截图

  •  8
  • rsthegreat12  · 技术社区  · 10 年前

    我正在制作一个程序,可以单击键盘的打印屏幕键。我使用的代码如下:

    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键,以及在松开打印屏幕键之后释放Alt键,但我得到的不同之处是,当我试图在绘画上超越它时,我会画出某种全黑屏幕。。。这只是我做的一个测试,看看它是否有区别,但我的实际键盘只需点击打印屏幕按钮即可进行屏幕截图。

    你知道我做错了什么吗?

    编辑日期: 为了让你们知道,程序实际上是编译的。我还添加了将剪贴板文件保存到目录的其他代码,如果我手动点击打印屏幕按钮,我确实正确地保存了文件。。。但若我继续循环这段代码并将其保存到目录中,则会出现手动获取的屏幕截图的相同图片。。。这就是我如何确定打印屏幕按钮的点击有问题。

    2 回复  |  直到 10 年前
        1
  •  4
  •   Software_Designer    10 年前

    在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
  •  3
  •   Masoud Rahimi Chris    5 年前

    这是用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();
    }