【已解决】双显示器截屏

JRJJ 4月前 525

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

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

    仔细看了你的工程代码

    以下是分析说明,供参考

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

      var screenArea = mouse.screenArea();

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

     	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 源码,发现

     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

    具体改动方法如下:

     //修改库文件 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(); 
    		}
    	}

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

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