?
Solved

Delphi: grab window content that is hidden or minimized

Posted on 2007-11-23
11
Medium Priority
?
1,494 Views
Last Modified: 2010-04-21
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

0
Comment
Question by:Cédric MARCOUX
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 5
11 Comments
 
LVL 16

Expert Comment

by:CodedK
ID: 20338726
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
 
LVL 1

Author Comment

by:Cédric MARCOUX
ID: 20338756
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
 
LVL 16

Expert Comment

by:CodedK
ID: 20338759
Setfocus works even if its minimized or hidden !
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 1

Author Comment

by:Cédric MARCOUX
ID: 20338778
SetFocus(h);

give error "Too many actual parameters"


0
 
LVL 16

Expert Comment

by:CodedK
ID: 20338794
Sorry for this.
I am at work and i can test this right.
Try : SetForegroundWindow(h);
0
 
LVL 1

Author Comment

by:Cédric MARCOUX
ID: 20338866
work if window is on the front
White capture if minimised or on another virtual desktop
0
 
LVL 16

Expert Comment

by:CodedK
ID: 20338933
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
 
LVL 1

Author Comment

by:Cédric MARCOUX
ID: 20339265
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
 
LVL 16

Expert Comment

by:CodedK
ID: 20345050
Hi Cmarcx.
DirectX is fast. But its purpose is to draw graphics, not to read.
0
 
LVL 5

Accepted Solution

by:
wd123 earned 1500 total points
ID: 20547851
try something from it:
1. WM_PRINT/ WM_PRINTCLIENT (http://www.fengyuan.com/article/wmprint.html)
2. PrintWindow
0
 
LVL 1

Author Closing Comment

by:Cédric MARCOUX
ID: 31410659
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

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Do you want to know how to make a graph with Microsoft Access? First, create a query with the data for the chart. Then make a blank form and add a chart control. This video also shows how to change what data is displayed on the graph as well as form…
Are you ready to place your question in front of subject-matter experts for more timely responses? With the release of Priority Question, Premium Members, Team Accounts and Qualified Experts can now identify the emergent level of their issue, signal…
Suggested Courses

649 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question