Electron 实现以管理员权限自启动

Electron 其实提供的跨平台的通用开机自启动支持。

但是因为Windows系统的限制,如果您的Electron在运行时要使用管理员权限的话,这样设置的自启动会失效。

目前解决方法有两种,一种是服务,另一种是写注册表启动项

服务的方案,优点就是,在启动的时候不会弹出UAC,缺点是,需要额外的精力来维护这个服务支持组件。

所以,个人比较推荐使用写注册表的方式

缺点就是开机会弹UAC~ 不过无伤大雅

let cp = require('child_process');
// 获取可执行文件位置
const ex=process.execPath;

// 定义事件,渲染进程中直接使用

// 开启 开机自启动
ipcMain.on('openAutoStart',()=>{
    console.log('updateExe',ex)
        // 注释的是electron官方提供的自启方法
        // app.setLoginItemSettings({
        //     openAtLogin: true,//是否自启
        //     openAsHidden:false,//启动后是否显示窗体
        //     path: ex,//启动路径
        //     args: [] //启动时的参数
        // });
        cp.exec(`REG ADD HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v 这是写入的注册表项字段名 /t REG_SZ /d "${ex}" /f`,function(err){
            console.log(err);
        });
});
// 关闭 开机自启动
ipcMain.on('closeAutoStart',()=>{
        // 注释的是electron官方提供的自启方法
        // app.setLoginItemSettings({
        //     openAtLogin: false,//是否自启
        //     openAsHidden:false,//启动后是否显示窗体
        //     path: ex,//启动路径
        //     args: [] //启动时的参数
        // });
        cp.exec("REG DELETE HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v 这是写入的注册表项字段名 /f",function(err){
            console.log(err);
        });
})

//检查注册表项是否存在
ipcMain.handle('checkAutoStart',async ()=>{
    return await new Promise((resolve, reject)=>{
        cp.exec("REG QUERY HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v ClonBrowser",function(err,stdout,stderr){
            resolve(stdout);
            console.log(stderr);
            console.log(err);
        });
    })
})

Waxy主题:自定义公告显示动态一言

本篇文章为Waxy主题设置中自定义CSS/JS的高级应用。

效果

最终效果演示最终效果演示

实现方法

置顶公告

<div class="hitokoto"><span class="typed" id="hitokoto"></span></div>

自定义CSS样式、

.top-text-body {
    /*设置公告栏高度,可以按需更改*/
    height: 25px;
}
.top-text-body::before{
    /*删除公告栏中公告两个字*/
    content: "";
}

自定义JS

JS判断是否为手机浏览器

JS判断访问网站的设备平台,跳转到对应优化的页面。

//平台、设备和操作系统
var system = {
    win: false,
    mac: false,
    xll: false,
    ipad: false
};
//检测平台
var p = navigator.platform;
system.win = p.indexOf("Win") == 0;
system.mac = p.indexOf("Mac") == 0;
system.x11 = (p == "X11") || (p.indexOf("Linux") == 0);
system.ipad = (navigator.userAgent.match(/iPad/i) != null) ? true : false;
//跳转语句,如果是手机访问就自动跳转到手机页面
if (system.win || system.mac || system.xll || system.ipad) {
    //alert("PC");
} else {
    var ua = navigator.userAgent.toLowerCase();
    if (ua.match(/MicroMessenger/i) == "micromessenger") {
        //alert("微信浏览器");
    } else {
        //alert("手机");
    }
}

Factorio(异星工厂)自用开服脚本

Factorio(异星工厂)自用开服脚本,自动初始化存档,自动载入最新的存档。


使用说明

1. 复制脚本到 start.sh 文件中请勿使用记事本

info:start.sh:下载 | 源代码

2. 修改 HOME_DIR 为你实际Factorio安装目录。

3. 编辑 server-settings.json 为你需要的配置放到Factorio的 data 目录下

4. 为脚本添加运行权限

#为脚本添加运行权限
sudo chmod +x start.sh

5. 运行脚本(建议使用screen)

warning:如果提示需要 GLIBC_2.18 请移步这里
#安装screen
sudo yum install screen -y

#进入screen环境
screen

#运行脚本
./start.sh

一个简单的ESP8266WiFi时钟

首先,上效果图


你可能需要的准备


连线&安装NTPClient库

安装NTPClient库

这次我们选择NTPClient库,联网获取ntp时间。

项目地址

#获取UNIX时间戳
getEpochTime();

#获取当前时间
getFormattedTime();

#获取星期,0是星期日
getDay();


连线

  • D1 --- SDA
  • D2 --- SCL
  • 3V --- VCC
  • G --- GND

2089953529.png2089953529.png


代码

#include <Arduino.h>
#include <U8g2lib.h>
#include <time.h>
#include <SPI.h>
#include <Wire.h>
#include <NTPClient.h>
// change next line to use with another board/shield
#include <ESP8266WiFi.h>
//#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>

#define SDA 05 //ESP8266 D1 PIN 05
#define SCL 04 //ESP8266 D2 PIN 04



const char *ssid     = "360 N7 Pro";
const char *password = "123456780";
char *week = "";


//SSD1306,128x64,全屏缓冲模式,模拟I2C,I2C,u8g2(旋转0度,时钟,数据,重置)
U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); 

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ntp1.aliyun.com",60*60*8, 30*60*1000);//设置访问的ntp服务器

void setup(){
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  timeClient.begin();
  u8g2.begin();
  u8g2.enableUTF8Print();
}

void loop() {
  timeClient.update();
  u8g2.setFont(u8g2_font_unifont_t_chinese2);
  u8g2.firstPage();  
  do {
    u8g2.setCursor(0, 15);
    u8g2.print("北京时间:="); 
    u8g2.setCursor(0, 35);
    u8g2.print(timeClient.getFormattedTime()); 
    u8g2.setCursor(75, 35);
    switch(timeClient.getDay();){
      case 0:
            week = "Sun.";
            break;
      case 1:
            week = "Mon.";
            break;
      case 2:
            week = "Tues.";
            break;
      case 3:
            week = "Wed.";
            break;
      case 4:
            week = "Thur.";
            break;
      case 5:
            week = "Fri.";
            break;
      case 6:
            week = "Sat.";
            break;    
      }
    u8g2.print(week);  
    u8g2.setCursor(0, 55);
    time_t t;  
    struct tm *p;  
    t=timeClient.getEpochTime();  
    p=gmtime(&t);  
    char s[100];  
    //strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", p);  
    strftime(s, sizeof(s), "%Y年%m月%d日", p);  
    u8g2.print(s);  
  } while ( u8g2.nextPage() );
  Serial.println(timeClient.getEpochTime());
  delay(1000);
}