【niva】 最简单版本 使用html 制作exe

150 阅读1分钟
<meta charset="UTF-8" />
<style>
	pre,
	body,
	html {
		margin: 0;
		padding: 0;
	}

	body {
		display: flex;
		flex-direction: column;
		height: 100vh;
		margin: 0;
		padding: 0 5px;
	}

	#main {
		flex: 1;
		padding: 0 5px;
	}

	.modal {
		display: none;
		position: absolute;
		top: 50%;
		left: 50%;
		transform: translate(-50%, -50%);
		background-color: #f9f9f9;
		padding: 20px;
		border: 1px solid #ccc;
		text-align: center;
	}

	.modal-content {
		display: flex;
		align-items: center;
		align-content: baseline;
		flex-wrap: wrap;
		width: 70vw;
		max-height: 70vw;
		min-height: 100px;
		overflow: auto;
	}

	.modal-content button {
		margin: 2px;
		display: inline-block;
		color: #FFF;
	}
</style>
<div style="padding:5px">
	<button onclick="toggle('')">Toggle</button>
	<button onclick="toggleSide('')">贴边</button>
	<button onclick="base(1)">基座</button>
	<button onclick="base(0)">测试</button>
	<button onclick="takeColor()" title="可按Alt+C进行取色">取色</button>
	<button onclick="runBat('mspaint')">画板</button>
	<button onclick="runBat('calc')">计算器</button>
	<button onclick="runBat('control')">控制面板</button>
	<button onclick="runBat('SystemPropertiesAdvanced')">环境设定</button>
	<button onclick="runBat('taskmgr')">任务管理</button>
	<button onclick="runBat('regedit')">注册表</button>
	<button onclick="runBat('rundll32.exe powrprof.dll,SetSuspendState Hibernate')">sleep</button>
</div>
<pre id="main" contenteditable="false" style="line-height: 15px;cursor: pointer;">
http://www.baidu.com   
document.designMode='on'
</pre>

<div class="modal">
	<div class="modal-content">
		<button onclick="closeModal()">关闭</button>
	</div>
</div>

<script>
	var file = "wz.tool.note.md"
	var main = document.getElementById('main')
	var modal = document.getElementsByClassName('modal')[0];
	var content = document.getElementsByClassName('modal-content')[0];
	async function getPath(file) {
		var { document } = await Niva.api.os.dirs();
		return document + "/" + file;
	}
	function commonFetch(path, data) {
		return new Promise((resolve, reject) => {
			fetch('http://127.0.0.1:1001' + path, {
				method: 'POST', headers: { 'Content-Type': 'application/json' },
				body: JSON.stringify(data)
			}).then(response => {
				if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
				return response.json();
			}).then(data => resolve(data)).catch(error => reject(error));
		});
	}
	async function runBat(cmd) {
		commonFetch("/api/cmd", { cmd })
	}
	async function base(f) {
		if (f) {
			Niva.api.process.exec("Common.exe")
		} else {
			Niva.api.process.open("http://127.0.0.1:1001/api/color")
		}
	}

	async function toggle() {
		main.contentEditable = main.contentEditable === 'true' ? 'false' : 'true';
		Niva.api.fs.write(await getPath(file), main.innerText)
	}
	async function toggleSide() {
		Niva.api.window.setOuterPosition({ x: window.screen.width * 0.9, y: window.screen.height * 0.1 });
	}
	async function closeModal() {
		modal.style.display = 'none';
	}
	async function callTakeColor() {
		var res = await commonFetch("/api/color", {}) 
		var copyButton = document.createElement('button');
		var color = '#' + res.rgba.map(value => { const hex = value.toString(16); return hex.length === 1 ? '0' + hex : hex; }).join('');
		navigator.clipboard.writeText(color)
		copyButton.innerText = color;
		copyButton.style.backgroundColor = `rgba(${res.rgba.join(",")})`;
		copyButton.addEventListener('click', function () {
			navigator.clipboard.writeText(color)
		});
		content.appendChild(copyButton);
	}

	async function takeColor() {
		var { display } = modal.style
		if (display == 'block') {
			clearInterval(window.time)
		} else {
			modal.style.display = 'block';
			window.time = setInterval(async () => { callTakeColor() }, 1000)
		}
	}

	window.onload = async () => {
		main.addEventListener('click', function (event) {
			var line = main.innerText.split('\n')[Math.floor(event.offsetY / 15)].trim()
			if (main.contentEditable == 'true') return;
			if (line.startsWith("D:\\") || line.startsWith("C:\\")) return commonFetch("/api/cmd", { cmd: 'code ' + line })
			Niva.api.clipboard.write(line)
			Niva.api.process.open(line.startsWith('http') ? line : 'https://www.baidu.com/s?wd=' + encodeURIComponent(line));
		}) 
		main.innerText = await Niva.api.fs.read(await getPath(file), "utf8") || '';// 读取文件设置内容 文件不存在就报错没有关系了
	} 
	document.addEventListener('keydown', function (event) {
		if (event.altKey && event.key === 'c')  callTakeColor()
	});

</script>

niva.json

{
	"name": "wzskyline",
	"uuid": "d35b4408-b64e-4978-9b56-a80ff4b152d8",
	"visible": false,
	"icon": "icon.png",
	"activation": "accessory",

	"window": {
		"visible": true,
		"alwaysOnTop": true,
		"visibleOnAllWorkspaces": false,
		"decorations": false,
		"transparent": false,
		"icon": "icon.png", 
		"size": {
			"width": 800,
			"height": 800
		},
		"menu": [ 
		]
	}, 
	"shortcuts": [
		{"id": 1, "accelerator": "CommandOrControl+Shift+Backslash"}
	],

	"macos": {
		"window": {
			"title": "MacOS",
			"decorations": true
		}
	},

	"windows": {
		"window": {
			"title": "wzskyline",
			"decorations": true
		}
	}
}