【已解决】双显示器截屏

JRJJ 10月前 895

截屏,基本功能正常,但是双显示器,只能对第一个屏幕截屏。如何实现双显示器截屏?

Code AardioLine:36复制
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
    • import win.ui;
    • /*DSG{{*/
    • var winform = win.form(text="aardio form";right=759;bottom=469)
    • winform.add(
    • button={cls="button";text="Button";left=175;top=120;right=489;bottom=234;z=1}
    • )
    • /*}}*/
    • import gdip.snap;
    • import mouse.screenArea;
    • import fsys.time
    • dtstr = function(){
    • var tm = time.now();
    • var str = tostring(tm,"%Y%m%d_%H%M%S","chs")
    • return str;
    • }
    • var imgname=function(){
    • var _name=tostring("e:\")+"\"+dtstr()+".jpg";
    • //lf("{} {}",_name)
    • return _name;
    • }
    • winform.button.oncommand = function(id,event){
    • var screenArea = mouse.screenArea();
    • var name=imgname()
    • screenArea.onSelectionChanged = function(rc){
    • //import gdip.snap;
    • var bmp = gdip.snap(screenArea.hwnd,rc.xywh());
    • owner.close();
    • bmp.save(name,100);
    • }
    • screenArea.doModal(winForm)
    • }
    • winform.show();
    • win.loopMessage();
    • return winform;


    最新回复 (5)
    • 光庆 10月前
      0 2
      双显示器还没玩过。没有测试环境。
    • JRJJ 10月前
      0 3
      双显示器,效果是在第二个屏幕上运行,等待鼠标选择区域的时候背景就变成第一个屏幕上的画面了
    • 小肥羊 10月前
      1 4

      仔细看了你的工程代码

      以下是分析说明,供参考

      代码中这个截图的蒙版覆盖,你使用了

      Code AardioLine:1复制
    • 1.
      • var screenArea = mouse.screenArea();

      来创建了覆盖蒙版,而蒙版中使用的是

      Code AardioLine:3复制
    • 1.
    • 2.
    • 3.
      • var srcX,srcY,srcCx,srcCy = ..win.getScreenPos(this.hwnd);
      • this.setPos( srcX,srcY,srcCx,srcCy,-1/*_HWND_TOPMOST*/ );
      • var pic = ..com.picture.snap();

      其中,继续查看com.pitcure.snap 源码,发现

      Code AardioLine:7复制
    • 1.
    • 2.
    • 3.
    • 4.
    • 5.
    • 6.
    • 7.
      • snap = function(hwnd,x=0,y=0,w,h,clientOnly) {
      • var hSrc = ..win.getDesktop();
      • if( hwnd===null ) hwnd = hSrc;
      • if( hSrc!==hwnd ){
      • ..win.showForeground(hwnd);
      • ..thread.delay(10);
      • }

      win.getDesktop其实是调用的:GetDesktopWindow()

      在多显示器中,桌面主要指的窗口其实是不包括副屏的。

      所以,如果需要改善这个问题,只需要把snap改掉,不要用现有的com.picture.snap

      具体改动方法如下:

      Code AardioLine:19复制
    • 1.
    • 2.
    • 3.
    • 4.
    • 5.
    • 6.
    • 7.
    • 8.
    • 9.
    • 10.
    • 11.
    • 12.
    • 13.
    • 14.
    • 15.
    • 16.
    • 17.
    • 18.
    • 19.
      • //修改库文件 mouse.screenArea 源码
      • this.beforeShowWindow = function(shown,status){
      • if(shown){
      • var srcX,srcY,srcCx,srcCy = ..win.getScreenPos(this.hwnd);
      • this.setPos( srcX,srcY,srcCx,srcCy,-1/*_HWND_TOPMOST*/ );
      • /*
      • var pic = ..com.picture.snap();
      • this.setBitmap(pic.CopyHandle() )
      • ..com.Release(pic);
      • */
      • //修改以下三行
      • import gdip.snap;
      • var img = gdip.snap(,srcX,srcY,srcCx,srcCy);
      • this.setBitmap(img.copyHandle())
      • this.mask.predraw();
      • }
      • }

      至此,这个问题就解决了。再次在副屏截图就没有问题了。

    • 小肥羊 10月前
      0 5
      要彻底解决这个问题,要么自己复制一个mouse.screenArea库 要么等一鹤老大升级时修改。
    • JRJJ 10月前
      0 6
      感谢大佬!
    返回