Delphi: grab window content that is hidden or minimized

Hi all!
I currently try to capture content of a specific Window that does not have focus.
This is a direct3d application

Currently working but when capturing this window, if another is on the front, i have this fronted window on my screenshot (that normal)

But I want to be able to capture a screenshot of this window even if another is on the front and get exact image capture of this window.

Any idea?

Currently I use this code:


procedure TFRM_Main.Grab(bm: TBitMap; gt : GrabType);
var
  h: THandle;
  hdcSrc : THandle;
  var WoWHandle : THandle; // handle global de wow
classname: array[0..255] of char; // class du handle de wow
begin
  case(gt) of
    GTWINDOW : h := GetForeGroundWindow;
    GTSCREEN : h := GetDesktopWindow;
  else h := 0;
  end;
  try
    if h <> 0 then
    begin
      WoWHandle := FindWindow(nil,'My Direct3D App');
      GetClassName(WoWHandle,ClassName,SizeOf(ClassName));
      h := FindWindow(classname,nil);
      hdcSrc := GetWindowDC(h);
      GetWindowRect(h, SourceRect);
      bm.PixelFormat:=pf4bit;
      bm.Width  := SourceRect.Right - SourceRect.Left;
      bm.Height := SourceRect.Bottom - SourceRect.Top;
      DestRect := Rect(0, 0,
            SourceRect.Right - SourceRect.Left,
            SourceRect.Bottom - SourceRect.Top);
      StretchBlt(bm.Canvas.Handle, 0, 0, bm.Width,
            bm.Height, hdcSrc, 0, 0,bm.Width,bm.Height,
            SRCCOPY);
      end;
  finally
    ReleaseDC(0, hdcSrc);
  end;
end;

Open in new window

LVL 1
Cédric MARCOUXConsultant Indépendant L3 - MicroITAsked:
Who is Participating?
 
wd123Connect With a Mentor Commented:
try something from it:
1. WM_PRINT/ WM_PRINTCLIENT (http://www.fengyuan.com/article/wmprint.html)
2. PrintWindow
0
 
CodedKCommented:
Hi.

Can you try :
SetFocus(h); after FindWindow ?
~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
If this doesnt work then try :
...
  if (GetForegroundWindow <> h) then
  begin
   SetWindowPos(h, HWND_TOPMOST, 0,0,0,0,SWP_NOACTIVATE  or SWP_NOMOVE or SWP_NOSIZE);
  end;
~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
0
 
Cédric MARCOUXConsultant Indépendant L3 - MicroITAuthor Commented:
I don't want to get back focus, I want to let the appz hidden or minimised...
But will try your peice of code, thx
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
CodedKCommented:
Setfocus works even if its minimized or hidden !
0
 
Cédric MARCOUXConsultant Indépendant L3 - MicroITAuthor Commented:
SetFocus(h);

give error "Too many actual parameters"


0
 
CodedKCommented:
Sorry for this.
I am at work and i can test this right.
Try : SetForegroundWindow(h);
0
 
Cédric MARCOUXConsultant Indépendant L3 - MicroITAuthor Commented:
work if window is on the front
White capture if minimised or on another virtual desktop
0
 
CodedKCommented:
I'm reading an article in CodeProjects.
It says that there is no problem to capture a hidden OR partially hidden window.
The problem appears when its minimized !
Read this :
http://www.codeproject.com/useritems/CapturingMinimizedWindow.asp
It explains in detail the steps you should take.

Basically the trick is to put in front one way or another and then back to the previous state....

0
 
Cédric MARCOUXConsultant Indépendant L3 - MicroITAuthor Commented:
seems tricky but very loud to do.
Keep in mind that i want capture direct3d screen, perhaps possible do to it thrue a directx api???
0
 
CodedKCommented:
Hi Cmarcx.
DirectX is fast. But its purpose is to draw graphics, not to read.
0
 
Cédric MARCOUXConsultant Indépendant L3 - MicroITAuthor Commented:
Thank you, this should help me finish my code, I have found several code using this method, i'em pretty sure that I will found solution using this way.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.