我定义了一个Tactionlist,其中包含显示/隐藏表单的所有操作。 这可以是模态(显示模态)或非模态(可见:= 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个动作是主表单,然后是其他表单,例如日志簿或浏览器,或者……几乎没有我想要的表单。

我发现了一些建议使用“ 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]);

===============>>#1 票数: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

您必须从模态表单中启动屏幕捕获,才能捕获其屏幕。

  ask by Christine Ross translate from so

未解决问题?本站智能推荐:

8回复

如何在Delphi中拍摄活动窗口的屏幕截图?

对于完整的屏幕截图,我使用以下代码: 如何将其转换为仅活动窗口的屏幕截图。
2回复

拍摄特定区域的屏幕截图

我正在使用Lazarus,并且在表单中有一个TImage。 黑表是一个TImage ,数字是labels 。 我需要对我绘制的红色区域进行截图。 我该如何执行呢? 我有Lazarus 1.0.14,但没有找到任何示例。 有什么建议吗?
1回复

其尺寸大于屏幕尺寸的表单的屏幕截图

我有一个TForm对象,其高度大于我的屏幕所需的垂直分辨率。 出于某种原因,Windows不允许表单的可见(客户端?)区域超出屏幕分辨率,因此垂直滚动条出现在我的表单上。 我如何获得TBitmap图像或整个表单的屏幕截图(没有滚动条,所有表单组件都可见),以便表单的所有内容都可见?
1回复

如何创建特定区域的屏幕截图?

我有代码接收服务器端之前已定义的特定区域,并在客户端的Form上创建一个漏洞。 而不是这个,我想得到这个相同区域的屏幕截图,但没有在最终结果中显示我的表格,就像正常的桌面捕捉,但在这种情况下将只捕获,这个小区域。 那么,我如何调整下面的代码呢?
1回复

在使用Firemonkey拍摄的屏幕截图中包含鼠标光标

我通过如何使用FireMonkey(多平台)拍摄截图的接受答案的代码,将一个截图(不仅仅是我的表格的屏幕截图)写入了TImage。 但是我想在图像中包含鼠标光标,所以我正在寻找一个解决方案,在第二步中将光标绘制在TImage上。 在Windows VCL项目中, http ://www.
1回复

我的Delphi XE7应用的Android屏幕截图

在我的Android手机上:如何在Delphi XE7应用程序中同时按住右侧的待机键和主页按钮。 即访问这两个按钮可以从我的应用程序(到图片文件夹)中截取屏幕截图?
3回复

如何使用FireMonkey(多平台)截取屏幕截图

我没有找到在FMX.Platform中获取屏幕截图的功能(无论如何,其他地方......)。 使用VCL,有很多答案(stackoverflow,google,...)。 但是如何在Windows和Mac OS X的图像(位图或其他)中获取屏幕截图? 问候, W.
1回复

过去的DWM屏幕截图到TBitmap

我找到了一个演示应用程序,它能够使用DwmRegisterThumbnail获取最小化/隐藏窗口的屏幕截图。 它工作得很完美,但结果图像是以表单本身而不是TBitmap绘制的。 这是代码: 并按以下方式调用该函数: 参考 第二个参数是表单本身的句柄。 到目前为止
2回复

获取使用createdesktop api创建的桌面的屏幕截图

我正在使用createdesktop api创建一个桌面,我想截取屏幕截图或发送输入鼠标/键盘,而不会将桌面显示给用户。如何实现这一点的任何想法?
1回复

全屏表单后面的屏幕截图导致黑屏

我想捕获一个桌面图像,该图像在捕获时会忽略我的表单。 我喜欢这个答案 ,但无法捕获桌面内容,只有黑屏 。 因此,我需要帮助来尝试解决此问题。 这是我的版本,几乎没有更改: