संदर्भ: मैं ओपनसीवी में इसे खिलाने के लिए एक और विंडो का एक स्क्रीनशॉट लेने की कोशिश कर रहा हूं। मुझे वेब पर कुछ कोड मिला जो कि बिटमैप को कुछ ओपनसीवी के साथ काम करने में सक्षम होना चाहिए। दुर्भाग्य से मैं कुछ परेशानी में भाग गया।GetObject शून्य बीएमबीट के साथ एक बिटमैप क्यों देता है?
प्रश्न: बीएमबीट विशेषता/सदस्य हमेशा शून्य क्यों है? (मैं भी BitBlt के बजाय PrintWindow साथ की कोशिश की परिणाम ही था)
#include <iostream>
#include <string>
#include <Windows.h>
int main(int argc, char* argv[])
{
std::wstring windowName = L"Calculator";
RECT rect;
HWND hwnd = FindWindow(NULL, windowName.c_str());
if (hwnd == NULL)
{
return 0;
}
GetClientRect(hwnd, &rect);
HDC hdcScreen = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcScreen);
HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen,
rect.right - rect.left, rect.bottom - rect.top);
SelectObject(hdc, hbmp);
PrintWindow(hwnd, hdc, PW_CLIENTONLY);
BITMAP bmp;
GetObject(hbmp, sizeof(BITMAP), &bmp);
return 0;
}
क्या आप इस कोड के साथ स्क्रीनशॉट बनाने की कोशिश कर रहे हैं, बस हाथ से? ऐसा दिखता है। प्रिंटविंडो वह नहीं है जो आपको चाहिए यदि वह मामला है। यह सब एक डीसी के साथ लक्ष्य विंडो में WM_PRINT भेजता है जिस पर डंप करना है। इस बात की कोई गारंटी नहीं है कि विंडो उस संदेश को भी संसाधित करेगी, और यदि ऐसा है, तो आप जो चाहते हैं वह करें। आपके पास लगभग हर चीज है जो आपको चाहिए, लेकिन मेरा मानना है कि आपको स्क्रीन डीसी से बिट्स को अपने संगत डीसी में प्राप्त करने के लिए तैयार करने के लिए तैयार होने के लिए बिटबल्ट() का उपयोग करने की आवश्यकता है। – WhozCraig