最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 使用nextjs实现通过web控制屏幕亮度

    正文概述 掘金(codetyphon)   2021-02-10   554

    首先,创建一个nextjs(typescript)的项目:

    yarn create next-app --example with-typescript brightness
    

    然后,添加nircmd库:

    yarn add nircmd
    

    nircmd 可以方便地调用windows的系统功能。

    我们建立一个页面,用来调节windows的屏幕亮度。

    建立一个bright/pages/api/brightness.ts文件:

    const nircmd = require('nircmd');
    const handler = async (_req: NextApiRequest, res: NextApiResponse) => {
      const { brightness } = _req.body;
      try {
        nircmd(['setbrightness', parseInt(brightness)]);
        res.status(200).json({ ok: true })
      } catch (err) {
        res.status(500).json({ statusCode: 500, message: err.message })
      }
    }
    export default handler
    

    然后启动项目:

    yarn dev
    

    这时,可以向 http://localhost:3000/api/brightness 发送post请求:

    {
      brightness:10
    }
    

    这样,可以发现屏幕就暗下来了。

    api有了,接下来是建立前端页面。前端页面需要一个UI库,所以先添加UI库。

    yarn add @material-ui/core
    

    接下来,看前端页面 bright/pages/index.tsx 的代码:

    import Slider from '@material-ui/core/Slider'
    import { useEffect, useState } from 'react';
    const IndexPage = () => {
      const [value, setValue] = useState(0);
      const handleChange = (event: any, newValue: number) => {
        const val = Math.round(newValue)
        setValue(val);
        fetch("/api/brightness", {
          headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json'
          },
          body: JSON.stringify({ brightness: val }),
          method: "POST"
        })
      }
      return (
        <div>
          <Slider value={value} onChange={handleChange} />
        </div>
      )
    }
    export default IndexPage
    

    这样,就可以通过滑动条来改变屏幕的亮度。

    但是,它只能设置亮度,还不能获取亮度,这就导致刷新页面的时候,滑动条的位置是不正确的。

    因此,我们改一下后端,增加一个获取亮度的功能,它使用wmi-client库:

    yarn add wmi-client
    

    bright/pages/api/brightness.ts

    const WmiClient = require('wmi-client');
    const get = async () => {
        const query = 'SELECT CurrentBrightness,InstanceName FROM WmiMonitorBrightness';
        const wmi = new WmiClient({
            host: 'localhost',
            namespace: '\\\\root\\WMI'
        });
        return new Promise((resolve, reject) => {
            wmi.query(query, (err, res) => {
                if (err) {
                    reject(err);
                    return;
                }
                if (res.length === 0) {
                    reject(new Error('Unable to find any monitors to read brightness levels from'));
                    return;
                }
                resolve(res[0].CurrentBrightness / 100);
            });
        })
    }
    const handler = async (_req: NextApiRequest, res: NextApiResponse) => {
      const wmi_res:number = await get();
      res.status(200).json(wmi_res*100)
    }
    

    由于api有两个方法,一个是get,一个是post,因此,把两个合并到一起,现在是bright/pages/api/brightness.ts的全貌:

    const nircmd = require('nircmd');
    const WmiClient = require('wmi-client');
    import { NextApiRequest, NextApiResponse } from 'next'
    
    const get = async () => {
        const query = 'SELECT CurrentBrightness,InstanceName FROM WmiMonitorBrightness';
        const wmi = new WmiClient({
            host: 'localhost',
            namespace: '\\\\root\\WMI'
        });
        return new Promise((resolve, reject) => {
            wmi.query(query, (err, res) => {
                if (err) {
                    reject(err);
                    return;
                }
                if (res.length === 0) {
                    reject(new Error('Unable to find any monitors to read brightness levels from'));
                    return;
                }
                resolve(res[0].CurrentBrightness / 100);
            });
        })
    }
    
    const handler = async (_req: NextApiRequest, res: NextApiResponse) => {
        // const {
        //     query: { id, name },
        //     method,
        // } = _req
        switch (_req.method) {
            case 'GET':
                const wmi_res:number = await get();
                res.status(200).json(wmi_res*100)
                break
            case 'POST':
                const { brightness } = _req.body;
                console.log(brightness);
                try {
                    nircmd(['setbrightness', parseInt(brightness)]);
                    res.status(200).json({ ok: true })
                } catch (err) {
                    res.status(500).json({ statusCode: 500, message: err.message })
                }
                break
            default:
                res.status(405).end() //Method Not Allowed
                break
        }
    
    }
    
    export default handler
    

    接下来对前端页面进行改造,增加一个获得亮度的功能:

    import Slider from '@material-ui/core/Slider'
    import { useEffect, useState } from 'react';
    const IndexPage = () => {
      const [value, setValue] = useState(0);
      const handleChange = (event: any, newValue: number) => {
        const val = Math.round(newValue)
        setValue(val);
        fetch("/api/brightness", {
          headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json'
          },
          body: JSON.stringify({ brightness: val }),
          method: "POST"
        })
      }
      const getbrightness = () => {
        fetch("/api/brightness").then(res => { return res.json() }).then(val => {
          setValue(Math.round(val))
        })
      }
      useEffect(() => {
        getbrightness();
      }, [])
      return (
        <div>
          <Slider value={value} onChange={handleChange} />
        </div>
      )
    }
    export default IndexPage
    

    这样,就可以愉快滴通过web控制屏幕亮度了。

    最后,全部代码在 github.com/codetyphon/…


    起源地下载网 » 使用nextjs实现通过web控制屏幕亮度

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元