<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="description" content="A basic Hello World HTML page with metadata and OpenGraph headers"> <meta name="author" content="Your Name"> <title>Hello World</title> <!-- OpenGraph Metadata --> <meta property="og:title" content="Hello World"> <meta property="og:description" content="A basic Hello World HTML page with metadata and OpenGraph headers"> <meta property="og:type" content="website"> <meta property="og:url" content="http://example.com"> <meta property="og:image" content="http://example.com/image.jpg"> </head> <body> <h1>Hello World</h1> <p>Click start to start connection to backend and start Capture to start KVM-ing</p> <button id="startButton">Start</button> <button id="stopButton">Stop</button> <button id="capture">Capture</button> <button id="screenshot">Win + Shift + S</button> <script> let socket; let protocol = window.location.protocol === 'https:' ? 'wss' : 'ws'; let port = window.location.port ? window.location.port : (protocol === 'wss' ? 443 : 80); let socketURL = `${protocol}://${window.location.hostname}:${port}/hid`; /* Mouse */ document.getElementById('capture').addEventListener('click', function(event) { event.preventDefault(); event.stopPropagation(); // Remove old listeners if they exist document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mousedown', handleMouseDown); document.removeEventListener('mouseup', handleMouseUp); document.removeEventListener('wheel', handleScroll); // Add new listeners document.body.requestPointerLock(); document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mousedown', handleMouseDown); document.addEventListener('mouseup', handleMouseUp); document.addEventListener('wheel', handleScroll); if (socket) { // Reset USBKVM state to avoid stuck keys socket.send(JSON.stringify({ t: 'reset'})); } }); function handleMouseDown(event) { console.log(`Mouse button pressed: Button=${event.button}`); if (socket) { socket.send(JSON.stringify({ t: 'mw', s: 'md', d: event.button+"" })); } } function handleMouseUp(event) { console.log(`Mouse button released: Button=${event.button}`); if (socket) { socket.send(JSON.stringify({ t: 'mw', s: 'mu', d: event.button+"" })); } } function handleScroll(event) { console.log(`Mouse scrolled: DeltaX=${event.deltaX}, DeltaY=${event.deltaY}`); if (socket) { socket.send(JSON.stringify({ t: 'ms', y: event.deltaY })); } } document.addEventListener('pointerlockchange', function() { if (document.pointerLockElement === document.body) { console.log('Pointer locked'); } else { console.log('Pointer unlocked'); document.removeEventListener('mousemove', handleMouseMove); } }); function handleMouseMove(event) { console.log(`Mouse moved: X=${event.movementX}, Y=${event.movementY}`); if (socket) { socket.send(JSON.stringify({ t: 'mm', x: event.movementX, y: event.movementY })); } } /* Keyboard */ document.getElementById('startButton').addEventListener('click', function() { const socketUrl = socketURL; socket = new WebSocket(socketUrl); socket.addEventListener('open', function(event) { console.log('WebSocket is connected.'); }); socket.addEventListener('message', function(event) { console.log('Message from server ', event.data); }); document.addEventListener('keydown', handleKeyDown); document.addEventListener('keyup', handleKeyUp); }); document.getElementById('stopButton').addEventListener('click', function() { if (socket) { socket.close(); console.log('WebSocket is disconnected.'); } document.removeEventListener('keydown', handleKeyDown); document.removeEventListener('keyup', handleKeyUp); }); document.getElementById('screenshot').addEventListener('click', function() { if (socket) { // Send keydown for Shift socket.send(JSON.stringify({ t: 'kw', s: 'kd', d: 'LEFT_Shift' })); // Send keydown for Windows key socket.send(JSON.stringify({ t: 'kw', s: 'kd', d: 'Meta' })); // Send keydown for S socket.send(JSON.stringify({ t: 'kw', s: 'kd', d: 's' })); setTimeout(function() { // Send keyup for S socket.send(JSON.stringify({ t: 'kw', s: 'ku', d: 's' })); // Send keyup for Windows key socket.send(JSON.stringify({ t: 'kw', s: 'ku', d: 'Meta' })); // Send keyup for Shift socket.send(JSON.stringify({ t: 'kw', s: 'ku', d: 'LEFT_Shift' })); }, 1000); } }); function isNumpadEvent(event) { return event.location === 3; } function handleKeyDown(event) { event.preventDefault(); event.stopImmediatePropagation(); const key = event.key; if (socket){ if (key == "Shift" || key == "Control" || key == "Alt"){ if (event.location == 1){ socket.send(JSON.stringify({ t: 'kw', s: 'kd', d: "LEFT_" + key })); } else { socket.send(JSON.stringify({ t: 'kw', s: 'kd', d: "RIGHT_" + key })); } }else if (isNumpadEvent(event)){ socket.send(JSON.stringify({ t: 'kw', s: 'kd', d: "NUMPAD_" + key })); }else if (key == "PrintScreen"){ //Do nothing, press is hardware offloaded }else{ socket.send(JSON.stringify({ t: 'kw', s: 'kd', d: key })); } } } function handleKeyUp(event) { event.preventDefault(); event.stopImmediatePropagation(); const key = event.key; if (socket) { if (key == "Shift" || key == "Control" || key == "Alt") { if (event.location == 1) { socket.send(JSON.stringify({ t: 'kw', s: 'ku', d: "LEFT_" + key })); } else { socket.send(JSON.stringify({ t: 'kw', s: 'ku', d: "RIGHT_" + key })); } }else if (isNumpadEvent(event)){ socket.send(JSON.stringify({ t: 'kw', s: 'ku', d: "NUMPAD_" + key })); }else if (key == "NumLock" || key == "Pause"){ //Do nothing, release is hardware offloaded } else { socket.send(JSON.stringify({ t: 'kw', s: 'ku', d: key })); } } } </script> </body> </html>