2015-05-16 2 views
0

Я определил Tactionlist, который содержит все действия, чтобы показать/скрыть мои формы. Это может быть модальное (showmodal) или не модальное (visible: = true). Я нашел некоторый код, чтобы поймать снимки экрана этим:Как сделать снимок экрана моего фактического окна

procedure GetScreenShot(shotType: TScreenShotType; var img: TJpegImage); 
var 
    w,h: integer; 
    DC: HDC; 
    hWin: Cardinal; 
    r: TRect; 
    tmpBmp: TBitmap; 
begin 
    hWin := 0; 
    case shotType of 
    sstActiveWindow: 
     begin //This is what I use 
     //only the active window 
     hWin := GetForegroundWindow; 
     dc := GetWindowDC(hWin); 
     GetWindowRect(hWin,r); 
     w := r.Right - r.Left; 
     h := r.Bottom - r.Top; 
     end; //sstActiveWindow 
    sstActiveClientArea: 
     begin 
     end; //sstActiveClientArea 
    sstPrimaryMonitor: 
     begin 
     end; //sstPrimaryMonitor 
    sstDesktop: 
     begin 
     end; //sstDesktop 
    else begin 
     Exit; 
    end; //case else 
    end; //case 

    //convert to jpg 
    tmpBmp := TBitmap.Create; 
    try 
    tmpBmp.Width := w; 
    tmpBmp.Height := h; 
    BitBlt(tmpBmp.Canvas.Handle,0,0,tmpBmp.Width, 
     tmpBmp.Height,DC,0,0,SRCCOPY); 
    img.Assign(tmpBmp); 
    finally 
    ReleaseDC(hWin,DC); 
    FreeAndNil(tmpBmp); 
    end; //try-finally 
end; 

Мой «сканирование» процедура выглядит следующим образом:

for ACnt := 0 to GenActions.ActionCount - 1 do 
    begin 
    try 
    LogBook.ML(Format('%d. Aktion %s gestartet',[ACnt,quotedstr(GenActions.Actions[ACnt].Name)])); 
    if GenActions.Actions[ACnt].Tag > 0 then 
     begin // Action is ready for test 
     TAction(GenActions.Actions[ACnt]).checked:=true; 
     if GenActions.Actions[ACnt].Execute then 
       begin 
       LogBook.ML(Format('%d. Aktion %s erfolgreich ausgeführt',[ACnt,quotedstr(GenActions.Actions[ACnt].Name)])); 
       if SaveScreens then // var boolean 
        begin 
        img:=TJPEGImage.Create; 
        try 
        GetScreenShot(sstActiveWindow,img);   
        img.SaveToFile(IncludeTrailingBackslash(Optionen.PictPfad.Text)+inttostr(ACnt)+'.jpg'); 
        finally 
         img.Free; 
         end; 
        end; 
       repeat 
       sleep(100); 
       Application.ProcessMessages; 
       until not DM_Gen.TestTimer.Enabled ; //for modal windows a timer sends modalresult:=mrcancel 
       end; 
     end 
    else 
     begin 
     LogBook.ML(Format('%d Aktion %s nicht getestet',[ACnt,quotedstr(GenActions.Actions[ACnt].Name)])); 
     end; 
    except 
     on E: Exception do 
     LogBook.ML(Format('%d. Aktion hat Fehler %s gemeldet',[ACnt,E.Message])); 
     end; 
    end; 
finally 
    LogBook.ML('Testlauf beendet'); 
    end; 

Когда я запускаю этот код, я получаю около первых 150 мероприятий по MainForm , затем некоторые другие формы, такие как журнал регистрации или браузер или ... Почти никогда не нужна форма.

Я нашел несколько сообщений, которые рекомендовали использовать «findwindow». Вот моя проблема: я не знаю точного заголовка окна, потому что во всех окнах заголовок изменяется в событии onshow, чтобы показать фактическую информацию.

Любые идеи, как можно поймать мое фактическое открытое окно?

Так что проблема заключается в том, чтобы понять, как работают мои действия. Вот два типичных примера:

procedure TDM_Gen.VALstVisActExecute(Sender: TObject); 
begin 
if Sender is TAction then 
    begin // set some properties 
    end; 
ListeVeranst_2.Visible:=VALstVisAct.Checked; 
end; 

procedure TDM_Gen.NewVAActExecute(Sender: TObject); 
var 
NewVA : TNewVeranstaltung; 
begin 
if Sender <> nil then 
    begin 
    if Sender is TButton then 
     begin //do something depending on who fired 
     end; 
    end; 
try 
NewVA:=TNewVeranstaltung.Create(nil); 
case NewVA.ShowModal of 
mrOk: 
    begin // e.g. refresh some lists 
    end; 
mrCancel:  
    begin // clean up 
    end; 
end; 

finally 
    NewVA.Free; 
    end; 
end; 

Заголовок окна установлен во время OnShow мероприятия по:

caption:=Format('This is window %s %s',[Param1, Param2]); 
+3

Если вы не знаете, какое окно вы хотите, у нас есть шанс? –

+0

Я знаю, какое окно я хочу. Тот, который сделан видимым действием –

+0

Итак, что заставляет вас скриншоты снимать это окно? –

ответ

3

Проблема вы столкнулись из-за ShowModal метод, который блокирует вызов. Это означает, что весь последующий код после этого вызова начнет выполняться после закрытия формы.

поток Кода в следующем упрощенном пример:

MyAction.Execute; 
    CaptureScreen; 

procedure TSomeForm.MyActionExecute(Sender: TObject); 
var frm: TForm; 
begin 
    frm := TForm.Create(nil); 
    try 
    frm.ShowModal; // this call blocks execution of subsequent code in this method until form is closed 
    finally 
    frm.Free; 
    end; 
end; 

будет MyAction.Execute -> frm.ShowModal -> frm.Close -> frm.Free -> CaptureScreen

Вы должны инициировать захват экрана из вашей модальной формы для того, чтобы захватить его экран.

+0

Я не полностью убежден в вашем объяснении. Это звучит для модальных форм. Я проверю. Но что такое немодальные формы. Здесь должен работать мой код. Но это не работает с обоими –

+0

OK, вы правы для модальных форм. Запись журнала для успешного завершения действия (snipplet 2 line 10) всегда происходит после закрытия формы, поэтому код screencapture вычитается, когда формы больше нет. –

Смежные вопросы