Capturing a Picturebox in Windows 8
-
I have the following code which works on windows 7 but when I run my app on windows 8 I just get a black box. I am using VB6 and have seen several capture submissions here but they all do the same thing (or at least the several I have tried. Here is my code
Public Function CaptureWindow(ByVal hWndSrc As Long, ByVal Client As Boolean, ByVal LeftSrc As Long, ByVal TopSrc As Long, ByVal WidthSrc As Long, ByVal HeightSrc As Long) As Picture
Dim hDCMemory As Long Dim hBmp As Long Dim hBmpPrev As Long Dim hDCSrc As Long Dim hPal As Long Dim hPalPrev As Long Dim RasterCapsScrn As Long Dim HasPaletteScrn As Long Dim PaletteSizeScrn As Long Dim LogPal As LOGPALETTE On Error Resume Next If Client Then hDCSrc = GetDC(hWndSrc) Else hDCSrc = GetWindowDC(hWndSrc) End If hDCMemory = CreateCompatibleDC(hDCSrc) hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc) hBmpPrev = SelectObject(hDCMemory, hBmp) RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS) HasPaletteScrn = RasterCapsScrn And RC\_PALETTE PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE) If HasPaletteScrn And (PaletteSizeScrn = 256) Then LogPal.palVersion = &H300 LogPal.palNumEntries = 256 GetSystemPaletteEntries hDCSrc, 0, 256, LogPal.palPalEntry(0) hPal = CreatePalette(LogPal) hPalPrev = SelectPalette(hDCMemory, hPal, 0) RealizePalette hDCMemory End If BitBlt hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, vbSrcCopy hBmp = SelectObject(hDCMemory, hBmpPrev) If HasPaletteScrn And (PaletteSizeScrn = 256) Then hPal = SelectPalette(hDCMemory, hPalPrev, 0) End If DeleteDC hDCMemory ReleaseDC hWndSrc, hDCSrc Set CaptureWindow = CreateBitmapPicture(hBmp, hPal)
End Function
Any help in changing or making it work on windows 7 & 8 is much appreciated
On the Windows 7 computer that works, have you disabled Aero? It sounds like your code doesn't work with layered windows. Most Google results seem to suggest that you need to pass the
CAPTUREBLT
flag (&H40000000L
) to theBitBlt
function[^]. It's not declared in theRasterOp
enum[^], because VB6 came out a long time before Aero, so you'll need to declare it yourself. My VB's a bit rusty, but something like this should work:BitBlt hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, CLng(vbSrcCopy Or &H40000000L)
Edit: Forgot that VB6 uses
Long
for 32-bit integers. :-O
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
I want to thank everyone for their responses. As a matter of fact Richard has helped me out before with I question I asked about .net and I greatly appreciate it. I do program in .net and have done so for awhile. All of may main products have be upgraded as some suggested here. I do believe my question was detailed, I provided the particular code that I believed was the issue and did explain the issue I was having. It is probably my fault for this question getting off track. Just as much as ask the right question, answering the question should be just as important. If someone has an answer that is great. That is what these forums are for IMO anyways. Saying you should upgrade the code to .net doesn't answer the question (at least I do not think so because that is certainly the way to go. If you can justify the cost VS benefit). Maybe I asked it in the wrong forum. I agreed that programming in VB6 was not the greatest but it is what I had to work with. I was hoping that someone else had encounter the same issue. Here another way of looking at it. You have lived in your house for 10 years and you discover a leak in your plumbing. Now the plumbing is not the latest and greatest technology. Do you replace all of your plumbing? Do you say that the plumbing is 10 years old so you should buy a new house? Of course not. (No sarcasm intended here. Just trying to relay an analogy). You just fix the leak I am sure. As I said this question got a little off track, so again I want to thank everyone for their input it is always appreciated
gwittlock wrote:
Do you say that the plumbing is 10 years old so you should buy a new house?
You did not even replace a part with something newer when it was broken, you waited until it became obsolete in the industry. So, you already new that your 10 year old house was using an out of date plumbing, and went ahead with it because it is cheaper. You have chosen to become obsolete. And yes, I will keep hammering that point, because someone else "might" think that your argument is valid. It was, 2004. Not in 2014.
Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^]
-
Here's a simple suggestion: rewrite the above code in VB.NET and see what the results are.