0

pywin32 モジュールを使用して、ウィンドウのクライアント領域のビットマップを取得しようとしています。この質問の正確なコードを使用すると、デスクトップ全体のビットマップを取得できます。具体的には、返されたビットを見ると、4*(desktop-pixels) 個のエントリがあります。ただし、ウィンドウまたはクライアント領域に対して同様のことをしようとすると、ピクセルよりも少ないエントリが返されます。ウィンドウのビットマップを取得するための私のコードは以下のとおりです。ただし、いくつかのバリエーションを試しました。たとえば、ウィンドウ部分をクライアント領域に置き換えたり、(nXSrc、nYSrc) をゼロに設定したりします。私が間違っている可能性があることについて何か提案はありますか? どうもありがとう!

コード:

windowName = "MyProcessWindow"
windowHandle = win32ui.FindWindow(None, windowName).GetSafeHwnd()
windowRectangle = win32gui.GetWindowRect(windowHandle)
width = windowRectangle[2]-windowRectangle[0]
height = windowRectangle[3]-windowRectangle[1]
win32gui.SetForegroundWindow(windowHandle)
windowDeviceContext = win32gui.GetWindowDC(windowHandle)
deviceContextObject = win32ui.CreateDCFromHandle(windowDeviceContext)
compatibleDeviceContext = deviceContextObject.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(compatibleDeviceContext, width, height)
compatibleDeviceContext.SelectObject(dataBitMap)
compatibleDeviceContext.BitBlt((0,0), (width, height), deviceContextObject, (windowRectangle[0],windowRectangle[1]), win32con.SRCCOPY)
info = dataBitMap.GetInfo()
bits = dataBitMap.GetBitmapBits(False)
print info
print len(bits)
print (width*height)

印刷結果:

{'bmType': 0, 'bmWidthBytes': 92, 'bmHeight': 526, 'bmBitsPixel': 1, 'bmPlanes': 1, 'bmWidth': 728}
48392
382928
4

1 に答える 1

1

問題はこれだと思います:

dataBitMap.CreateCompatibleBitmap(compatibleDeviceContext, width, height)

ソースDCと互換性があり、適切な色深度とその他の機能を備えたビットマップを作成したいと考えています。次に、それをターゲット DC に選択して、適切な色深度、サイズ、およびその他の機能を与えることができます。

代わりに、ドキュメントで説明されているように、この時点で 1x1 の白黒 DC であるターゲットDCと互換性のあるものを作成しています。CreateCompatibleDC次に、それをターゲット DC に選択し、開始時のままにします。

そのため、1bpp の 1 つのプレーンを持つビットマップになってしまいます。

その方法の例については、Capturing a Imageサンプル (C で作成されたもので、ひどい C ですが、うまくいけば従うことができます) を参照してください。しかし、これがあなたが間違っている唯一のステップだと思います。

于 2013-11-15T01:20:13.173 に答える