interface ScreenSize {
width: number;
height: number;
}function getScreenSize(img): Promise<ScreenSize> {
const imgPath = path.resolve(process.cwd(), './tmp.png');
fs.writeFileSync(imgPath, img);
return new Promise((resolve): void => {
getPixels(imgPath, function(err, pixels): void {
if(err) {
console.log("Bad image path")
return
}
resolve({
width: pixels.shape[0],
height: pixels.shape[1] });
});
})
}
然后通过socektio传递给客户端
getScreenSize(img).then(({ width, height}) => {
io.sockets.emit('screensize', {
width,
height
})
});客户端收到之后调整图片大小就可以了
<img
class="screenshot"
:src="screenshot"
:style="screenshotStyle"
/>data () {
return {
screenshot: '',
screenshotStyle: '',
}
}
socket.on('screensize', (screensize) => {
this.screenshotStyle = {'width': screensize.width + 'px', 'height': screensize.height + 'px'}
})
至此已经实现了桌面监控,并且图片尺寸和服务端屏幕的尺寸是一致的。
这里还有一个细节,就是获取到的图片大小是物理像素,而客户端设置的px是设备无关像素,也就是要除以dpr才是px的值。这里需要获取dpr,因为目前只是在mac下用,所以直接除以2了。
实现远程控制
代码写到这里,客户端的electron应用中已经可以实时显示服务端的桌面了。(当然像输入ip的弹框,以及electron-vue和typescript等和主要逻辑无关的细节就不展开了。)
接下来我们要实现远程控制,也就是监听事件,传递事件,执行事件这几部分。
首先我们定义一下传递的事件的格式:
interface MouseEvent {
type: string;
buttonType: string;
x: number;
y: number;
}interface KeyboardEvent {
type: string;
keyCode: number;
keyName: string;
}
鼠标事件MouseEvent,type为鼠标事件的类型,具体的值包括mousedown、mouseup、mousemove、click、dblclick,buttonType指的是鼠标的左键还是右键,值为 left 或 right,x和y是具体的坐标。
键盘事件KeyboardEvent,type为键盘事件的类型,具体的值包括keydown、keyup、keypress,keyCode为键盘码,keyName为键的名字。
接下来我们要在客户端监听事件:
<img
class="screenshot"
:src="screenshot"
:style="screenshotStyle"
@mousedown="handleMouseEvent"
@mousemove="handleMouseEvent"
@mouseup="handleMouseEvent"
@click="handleMouseEvent"









