zoukankan      html  css  js  c++  java
  • 笔记本小键盘提示 C#

    穷人家的孩子,买了个笔记本愣是没有小键盘提示灯。

    牛的是人家给了一个大写提示灯。

    更牛的是他妈给了音量关闭打开的提示灯,还他妈是橙色的!!!!!!

    没办法 弄了小程序 来判断是否打开小键盘了。

    本来是想用键盘钩子的,不过发现焦点在任务管理器的时候键盘钩子是无法使用的。

    转念一想 干嘛那么麻烦。直接检测小键盘不就得了。

    直接上代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace IsNumLock
    {
        class Program
        {
            [DllImport("user32")]
            public static extern int GetKeyState(int intkey);//144检测NumLock是否打开
    
            [DllImport("Gdi32.dll")]
            static extern bool TextOutA(IntPtr hdc,int x,int y ,string lpString,int l);//WIN32 参数 在HDC上面输出文字
    
            [DllImport("user32")]
            public static extern IntPtr GetDesktopWindow();//获取桌面
    
            [DllImport("user32")]
            static extern IntPtr GetWindowDC(IntPtr hwnd);//获取桌面的DC
    
            static int i = -1;
    
            static IntPtr dc = GetWindowDC(GetDesktopWindow());
    
            static void Main(string[] args)
            {
                i = GetKeyState(144);
                while (true)
                {
                    Thread.Sleep(TimeSpan.FromMilliseconds(100)); //阻断一百毫秒 ,不然CPU会增加
                    KeyDown();//这里本来想用多线程的,不过发现如果处理不当 内存会递加倒不如直接是单线程了/
                }
            }
           
            static void KeyDown()
            {
                var op = GetKeyState(144);
                op = op == 65408 ? 0 : op == 65409 ? 1 : op;//这里写反了 将错就错了
                if (op != i)
                {
                    i = op;
                    dc = GetWindowDC(GetDesktopWindow());             
                    TextOutA(dc, 0, 0, op == 0 ? "Close" : "Open ", 5);//向屏幕输出
                    //这个参数 在桌面输出文字 ,应该还有一个方法来清空的桌面。不过发现会闪屏,也就算了
                    //就算不刷新,系统也会自动刷新。
                    //不会影响使用
                }
            }
        }
    }

     内存占用还是可以

    编译的时候,在属性里改成程序,不用控制台输出,改成64或者32 似乎没有什么影响

    如果大家用的还是不错 可以加设置开机启动

    代码:

                var Startrun = Environment.CurrentDirectory + "\IsNumLock.exe";//程序所在的全路径
                RegistryKey RKey = Registry.CurrentUser.CreateSubKey(@"SOFTWAREMicrosoftWindowsCurrentVersionRun");
                RKey.SetValue("IsNumLock", Startrun);

    不用代码的方式就用手动修改注册表

    win+r 打开运行 输入regedit 打开注册表

    计算机HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun

    之后右键 新建 -字符串值 重名为程序的名字,之后在点击此项 右键修改,将程序的目录输入进去就好了包括程序自己

    像是

    C:UsersAangsource
    eposIsNumLockIsNumLockinDebugIsNumLock.exe

    如果嫌弃注册表太麻烦了可以用

    https://jingyan.baidu.com/article/eae07827ad2bba1fec5485ae.html这篇文章的介绍

    百度云盘的下载方式程序下载

  • 相关阅读:
    从上往下打印二叉树
    栈的压入、弹出序列
    连续子数组的最大和
    链表中环形的入口
    1月项目痛点
    problem:vue组件局部刷新,在组件销毁(destroyed)时取消刷新无效问题
    重点:浏览器的工作原理
    12月中旬项目中出现的几个bug解决方法的思考
    12月中项目问题复盘之对项目进度把控的反思
    problem: vue之数组元素中的数组类型值数据改变却无法在子组件视图更新问题
  • 原文地址:https://www.cnblogs.com/T-ARF/p/9402463.html
Copyright © 2011-2022 走看看