.NET的键盘Hook管理类,用于禁用键盘输入和切换

一、MyHook帮助类

 此类需要编写指定屏蔽的按键,灵活性差。

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Windows.Forms;
using Microsoft.Win32;namespace MyHookClass
{/// <summary>/// 类一/// </summary>public class MyHook{//消息函数的委托public delegate int HookProc(int nCode, int wParam, IntPtr lParam);static int hHook = 0;public const int WH_KEYBOARD_LL = 13;//底层键盘钩子static HookProc KeyBoardHookProcedure;//按键信息结构[StructLayout(LayoutKind.Sequential)]public class KeyBoardHookStruct{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}//安装钩子[DllImport("user32.dll")]public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);//卸载钩子[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern bool UnhookWindowsHookEx(int idHook);//下一个钩挂的函数[DllImport("user32.dll")]public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);//返回当前线程 ID[DllImport("kernel32.dll")]public static extern int GetCurrentThreadId();//得到模块的句柄[DllImport("kernel32.dll")]public static extern IntPtr GetModuleHandle(string name);//安装钩子public static void InsertHook(){if (hHook == 0){KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);hHook = SetWindowsHookEx(WH_KEYBOARD_LL,KeyBoardHookProcedure,GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);if (hHook == 0){UnHook();throw new Exception("设置Hook失败!");}else{RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System", true);if (key == null)//如果该项不存在的话,则创建该项key = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System");key.SetValue("DisableTaskMgr", 1, RegistryValueKind.DWord);//key.SetValue("DisableLockWorkstation", 1, RegistryValueKind.DWord);key.Close();}}}//卸载钩子public static void UnHook(){bool retKeyboard = true;if (hHook != 0){retKeyboard = UnhookWindowsHookEx(hHook);hHook = 0;}//if (!retKeyboard) throw new Exception("卸载Hook失败!");RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System", true);if (key != null){key.DeleteValue("DisableTaskMgr", false);//key.DeleteValue("DisableLockWorkstation", false);key.Close();}}//按键消息的处理函数public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam){if (nCode >= 0){KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));//添加自己的判断语句,如果符合要求的按键,就 return 1; //没有判断直接 return 1;那么就屏蔽所有按键除了ctrl+alt+del//屏蔽Ctrl+Escif (kbh.vkCode == (int)Keys.Delete && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)      //截获Ctrl+Alt+Delete{PubLibrary.WriteErrLog("1.拦截信息:Ctrl+Alt+Delete");return 1;}if (kbh.vkCode == (int)Keys.Escape){PubLibrary.WriteErrLog("2.拦截信息:Escape");return 1;}if (kbh.vkCode == 91) // 截获左win(开始菜单键) {PubLibrary.WriteErrLog("3.拦截信息:截获左win");return 1;}if (kbh.vkCode == 92)// 截获右win {PubLibrary.WriteErrLog("4.拦截信息:截获右win");return 1;}//if (kbh.vkCode == (int)Keys.L)//{//    PubLibrary.WriteErrLog("5.拦截信息:L");//    return 1;//}if (kbh.vkCode == (int)Keys.Alt){PubLibrary.WriteErrLog("6.拦截信息:Alt");return 1;}if ((int)Control.ModifierKeys == (int)Keys.Alt) //截获alt{PubLibrary.WriteErrLog("7.拦截信息:Alt");return 1;}if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control) //截获Ctrl+Esc {PubLibrary.WriteErrLog("8.拦截信息:Ctrl+Esc");return 1;}if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Alt) //截获Alt+Esc {PubLibrary.WriteErrLog("9.拦截信息:Alt+Esc");return 1;}if (kbh.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt) //截获alt+f4 {PubLibrary.WriteErrLog("10.拦截信息:F4+Alt");return 1;}if (kbh.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt) //截获alt+tab{PubLibrary.WriteErrLog("10.拦截信息:alt+tab");return 1;}if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift) //截获Ctrl+Shift+Esc{PubLibrary.WriteErrLog("11.拦截信息:Ctrl+Shift+Esc");return 1;}if (kbh.vkCode == (int)Keys.Space && (int)Control.ModifierKeys == (int)Keys.Alt) //截获alt+空格 {PubLibrary.WriteErrLog("12.拦截信息:alt+空格");return 1;}if (kbh.vkCode == 241) //截获F1 {PubLibrary.WriteErrLog("13.拦截信息:F1");return 1;}if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete)      //截获Ctrl+Alt+Delete {PubLibrary.WriteErrLog("14.拦截信息:Ctrl+Alt+Delete");return 1;}if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift) //截获Ctrl+Shift {PubLibrary.WriteErrLog("15.拦截信息:Ctrl+Shift");return 1;}if (kbh.vkCode == (int)Keys.Space && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+空格 {PubLibrary.WriteErrLog("16.拦截信息:Ctrl+Alt+空格");return 1;}}return CallNextHookEx(hHook, nCode, wParam, lParam);}}
}

二、KeyboardHookLib帮助类

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using Microsoft.Win32;namespace VendorSoftwareReleaseLW.Class
{/// <summary>/// 键盘Hook管理类/// </summary>public class KeyboardHookLib{private const int WH_KEYBOARD_LL = 13; //键盘//键盘处理事件委托 ,当捕获键盘输入时调用定义该委托的方法.private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);//客户端键盘处理事件public delegate void ProcessKeyHandle(HookStruct param, out bool handle);//接收SetWindowsHookEx返回值private static int _hHookValue = 0;//勾子程序处理事件private HookHandle _KeyBoardHookProcedure;//Hook结构[StructLayout(LayoutKind.Sequential)]public class HookStruct{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}//设置钩子[DllImport("user32.dll")]private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId);//取消钩子[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern bool UnhookWindowsHookEx(int idHook);//调用下一个钩子[DllImport("user32.dll")]private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);//获取当前线程ID[DllImport("kernel32.dll")]private static extern int GetCurrentThreadId();//Gets the main module for the associated process.[DllImport("kernel32.dll")]private static extern IntPtr GetModuleHandle(string name);private IntPtr _hookWindowPtr = IntPtr.Zero;//构造器public KeyboardHookLib() { }//外部调用的键盘处理事件private static ProcessKeyHandle _clientMethod = null;/// <summary>/// 安装勾子/// </summary>/// <param name="hookProcess">外部调用的键盘处理事件</param>public void InstallHook(ProcessKeyHandle clientMethod){_clientMethod = clientMethod;// 安装键盘钩子if (_hHookValue == 0){_KeyBoardHookProcedure = new HookHandle(OnHookProc);_hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);//************************************ //键盘线程钩子 //SetWindowsHookEx( 2,KeyboardHookProcedure, IntPtr.Zero, GetCurrentThreadId()); //GetCurrentThreadId()为要监视的线程ID,你完全可以自己写个方法获取QQ的线程哦 //键盘全局钩子,需要引用空间(using System.Reflection;) //SetWindowsHookEx( 13,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0); // //关于SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId)函数将钩子加入到钩子链表中,说明一下四个参数: //idHook 钩子类型,即确定钩子监听何种消息,上面的代码中设为2,即监听键盘消息并且是线程钩子,如果是全局钩子监听键盘消息应设为13, //线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14。 // //lpfn 钩子子程的地址指针。如果dwThreadId参数为0 或是一个由别的进程创建的线程的标识,lpfn必须指向DLL中的钩子子程。 除此以外,lpfn可 //以指向当前进程的一段钩子子程代码。钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。 // //hInstance应用程序实例的句柄。标识包含lpfn所指的子程的DLL。如果threadId 标识当前进程创建的一个线程,而且子程代码位于当前 //进程,hInstance必须为NULL。可以很简单的设定其为本应用程序的实例句柄。 // //threadedId 与安装的钩子子程相关联的线程的标识符。如果为0,钩子子程与所有的线程关联,即为全局钩子。 //************************************ _hHookValue = SetWindowsHookEx(WH_KEYBOARD_LL,_KeyBoardHookProcedure,_hookWindowPtr,0);//如果设置钩子失败.if (_hHookValue == 0){UninstallHook();}else{RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System", true);if (key == null)//如果该项不存在的话,则创建该项key = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System");key.SetValue("DisableTaskMgr", 1, RegistryValueKind.DWord);//key.SetValue("DisableLockWorkstation", 1, RegistryValueKind.DWord);key.Close();}}}//取消钩子事件public void UninstallHook(){if (_hHookValue != 0){bool ret = UnhookWindowsHookEx(_hHookValue);if (ret) _hHookValue = 0;}RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System", true);if (key != null){key.DeleteValue("DisableTaskMgr", false);//key.DeleteValue("DisableLockWorkstation", false);key.Close();}}//钩子事件内部调用,调用_clientMethod方法转发到客户端应用。private static int OnHookProc(int nCode, int wParam, IntPtr lParam){if (nCode >= 0){//转换结构HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct));if (_clientMethod != null){bool handle = false;//调用客户提供的事件处理程序。_clientMethod(hookStruct, out handle);if (handle) return 1; //1:表示拦截键盘,return 退出}}return CallNextHookEx(_hHookValue, nCode, wParam, lParam);}}
}

三、在WinForm中的使用

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using MyHookClass;
using KeyboardHookLibClass;namespace TestForm
{public partial class LoginForm : Form{DateTime _dtNow;[DllImport("user32.dll")]private static extern IntPtr GetForegroundWindow();[DllImport("user32.dll")]private static extern bool SetForegroundWindow(IntPtr hWnd);[DllImport("user32.dll")]private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);[DllImport("user32.dll")]public static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);[DllImport("user32.dll")]public static extern bool IsWindowVisible(IntPtr hWnd);//勾子管理类private KeyboardHookLib _keyboardHook = null;public delegate void ForegroundWin();private void LoginForm_Load(object sender, EventArgs e){SetHook();Thread threadForeground = new Thread(ShowWindowAsync);//threadForeground.IsBackground = true;threadForeground.Start();}private void txt_KeyDown(object sender, KeyEventArgs e){_dtNow = DateTime.Now;}private void txt_KeyUp(object sender, KeyEventArgs e){if (e.KeyCode != Keys.Enter){DateTime dtTemp = DateTime.Now;TimeSpan ts = dtTemp.Subtract(_dtNow);if (ts.Milliseconds > 65){//setTool("错误:禁止手工输入!", "N");txt.Text = "";//清空}}}private void txtID_KeyPress(object sender, KeyPressEventArgs e){if (e.KeyChar == 13){//做些操作ClearHook();}}public static void SetWindowPos(IntPtr hWnd){//0x0010为不激活窗口,这个比较关键SetWindowPos(hWnd, -1, 0, 0, 0, 0, 0x0001 | 0x0002 | 0x0010);// 0x001 | 0x002 | 0x0010| 0x040}private void ShowWindowAsync(){while (true){//高版本的这里可以直接使用Action,更简化一些//ForegroundWin d = new ForegroundWin(action);//this.Invoke(d);Action a = new Action(() => { action(); });Thread.Sleep(100);//这个时间间隔,用户基本感觉不出有切换窗体}}void action(){IntPtr hWnd = this.Handle;if (hWnd != IntPtr.Zero || GetForegroundWindow() != hWnd){//选中当前的句柄窗口SetWindowPos(hWnd);//SendKeys.SendWait(" ");}}private void ClearHook() {//取消勾子if (_keyboardHook != null) _keyboardHook.UninstallHook();//MyHook.UnHook();//ProcessMgr.ResumeWinlogon();}private void SetHook() {//安装勾子_keyboardHook = new KeyboardHookLib();_keyboardHook.InstallHook(this.OnKeyPress);//MyHook.InsertHook();//ProcessMgr.SuspendWinlogon();}/// <summary>/// 客户端键盘捕捉事件./// </summary>/// <param name="hookStruct">由Hook程序发送的按键信息</param>/// <param name="handle">是否拦截</param>public void OnKeyPress(KeyboardHookLib.HookStruct hookStruct, out bool handle){handle = false; //预设不拦截任何键if (hookStruct.vkCode == 91) // 截获左win(开始菜单键){handle = true;}if (hookStruct.vkCode == 92)// 截获右win{handle = true;}if ((int)Control.ModifierKeys == (int)Keys.Alt) //截获alt{handle = true;}//截获Ctrl+Escif (hookStruct.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control){handle = true;}//截获alt+f4if (hookStruct.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt){handle = true;}//截获alt+tabif (hookStruct.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt){handle = true;}//截获alt+tabif (hookStruct.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Alt){handle = true;}//截获F1if (hookStruct.vkCode == (int)Keys.F1){handle = true;}//截获Ctrl+Alt+Deleteif ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete){handle = true;}//如果键A~Zif (hookStruct.vkCode >= (int)Keys.A && hookStruct.vkCode <= (int)Keys.Z){//挡掉B键if (hookStruct.vkCode == (int)Keys.B)hookStruct.vkCode = (int)Keys.None; //设键为0handle = true;}Keys key = (Keys)hookStruct.vkCode;PubLibrary.WriteErrLog("你按下:" + (key == Keys.None ? "" : key.ToString()));}}
}

四、其他类

using System;
using System.Runtime.InteropServices;namespace ShareToolClass
{public class ShareTool : IDisposable{[DllImport("advapi32.dll", SetLastError = true)]static extern bool LogonUser(string pszUsername, string pszDomain, string pszPassword,int dwLogonType, int dwLogonProvider, ref IntPtr phToken);// closes open handes returned by LogonUser       [DllImport("kernel32.dll", CharSet = CharSet.Auto)]extern static bool CloseHandle(IntPtr handle);[DllImport("Advapi32.DLL")]static extern bool ImpersonateLoggedOnUser(IntPtr hToken);[DllImport("Advapi32.DLL")]static extern bool RevertToSelf();const int LOGON32_PROVIDER_DEFAULT = 0;const int LOGON32_LOGON_NEWCREDENTIALS = 9;const int LOGON32_LOGON_INTERACTIVE = 2;private bool disposed;public ShareTool(string username, string password, string ip){// initialize tokens       IntPtr pExistingTokenHandle = new IntPtr(0);IntPtr pDuplicateTokenHandle = new IntPtr(0);try{// get handle to token       bool bImpersonated = LogonUser(username, ip, password,LOGON32_LOGON_NEWCREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref pExistingTokenHandle);if (bImpersonated){if (!ImpersonateLoggedOnUser(pExistingTokenHandle)){int nErrorCode = Marshal.GetLastWin32Error();throw new Exception("ImpersonateLoggedOnUser error;Code=" + nErrorCode);}}else{int nErrorCode = Marshal.GetLastWin32Error();throw new Exception("LogonUser error;Code=" + nErrorCode);}}finally{// close handle(s)       if (pExistingTokenHandle != IntPtr.Zero)CloseHandle(pExistingTokenHandle);if (pDuplicateTokenHandle != IntPtr.Zero)CloseHandle(pDuplicateTokenHandle);}}protected virtual void Dispose(bool disposing){if (!disposed){RevertToSelf();disposed = true;}}public void Dispose(){Dispose(true);}}
}
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;namespace ProcessMgrClass
{class ProcessMgr{/// <summary>/// The process-specific access rights./// </summary>[Flags]public enum ProcessAccess : uint{/// <summary>/// Required to terminate a process using TerminateProcess./// </summary>Terminate = 0x1,/// <summary>/// Required to create a thread./// </summary>CreateThread = 0x2,/// <summary>/// Undocumented./// </summary>SetSessionId = 0x4,/// <summary>/// Required to perform an operation on the address space of a process (see VirtualProtectEx and WriteProcessMemory)./// </summary>VmOperation = 0x8,/// <summary>/// Required to read memory in a process using ReadProcessMemory./// </summary>VmRead = 0x10,/// <summary>/// Required to write to memory in a process using WriteProcessMemory./// </summary>VmWrite = 0x20,/// <summary>/// Required to duplicate a handle using DuplicateHandle./// </summary>DupHandle = 0x40,/// <summary>/// Required to create a process./// </summary>CreateProcess = 0x80,/// <summary>/// Required to set memory limits using SetProcessWorkingSetSize./// </summary>SetQuota = 0x100,/// <summary>/// Required to set certain information about a process, such as its priority class (see SetPriorityClass)./// </summary>SetInformation = 0x200,/// <summary>/// Required to retrieve certain information about a process, such as its token, exit code, and priority class (see OpenProcessToken, GetExitCodeProcess, GetPriorityClass, and IsProcessInJob)./// </summary>QueryInformation = 0x400,/// <summary>/// Undocumented./// </summary>SetPort = 0x800,/// <summary>/// Required to suspend or resume a process./// </summary>SuspendResume = 0x800,/// <summary>/// Required to retrieve certain information about a process (see QueryFullProcessImageName). A handle that has the PROCESS_QUERY_INFORMATION access right is automatically granted PROCESS_QUERY_LIMITED_INFORMATION./// </summary>QueryLimitedInformation = 0x1000,/// <summary>/// Required to wait for the process to terminate using the wait functions./// </summary>Synchronize = 0x100000}[DllImport("ntdll.dll")]private static extern uint NtResumeProcess([In] IntPtr processHandle);[DllImport("ntdll.dll")]private static extern uint NtSuspendProcess([In] IntPtr processHandle);[DllImport("kernel32.dll", SetLastError = true)]private static extern IntPtr OpenProcess(ProcessAccess desiredAccess,bool inheritHandle,int processId);[DllImport("kernel32.dll", SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]private static extern bool CloseHandle([In] IntPtr handle);public static void SuspendProcess(int processId){IntPtr hProc = IntPtr.Zero;try{// Gets the handle to the ProcesshProc = OpenProcess(ProcessAccess.SuspendResume, false, processId);if (hProc != IntPtr.Zero)NtSuspendProcess(hProc);}finally{// Don't forget to close handle you created.if (hProc != IntPtr.Zero)CloseHandle(hProc);}}public static void ResumeProcess(int processId){IntPtr hProc = IntPtr.Zero;try{// Gets the handle to the ProcesshProc = OpenProcess(ProcessAccess.SuspendResume, false, processId);if (hProc != IntPtr.Zero)NtResumeProcess(hProc);}finally{// Don't forget to close handle you created.if (hProc != IntPtr.Zero)CloseHandle(hProc);}}public static void SuspendWinlogon(){Process[] processes = Process.GetProcesses();foreach (Process process in processes){if (process.ProcessName == "winlogon"){SuspendProcess(process.Id);}}}public static void ResumeWinlogon(){Process[] processes = Process.GetProcesses();foreach (Process process in processes){Console.WriteLine(process.ProcessName);if (process.ProcessName == "winlogon"){ResumeProcess(process.Id);}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/87928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文详解JDK8常用10个更新特性

今日一语&#xff1a;当你发现编程的规律就是世界的规律时&#xff0c;你就是一名真正的程序员 1 Lambda(蓝布达)表达式 编译后会产生一个$XXXImpl1的编译文件&#xff0c;与匿名内部类相似&#xff0c;但不等同于匿名内部类。 其原理是将方法作为参数进行传递&#xff0c; JV…

【深入浅出设计模式--命令模式】

深入浅出设计模式--命令模式 一、背景二、问题三、解决方案四、试用场景总结五、后记 一、背景 命令模式是一种行为设计模式&#xff0c;它可以将用户的命令请求转化为一个包含有相关参数信息的对象&#xff0c;命令的发送者不需要知道接收者是如何处理这条命令&#xff0c;多个…

php文件上传功能(文件上传)

实现文件上传是Web开发中常用的功能之一&#xff0c;而PHP也是支持文件上传的。那么&#xff0c;下面我们就来介绍一下常用的PHP实现文件上传的方法。 使用HTML表单实现文件上传 HTML表单是Web开发中最基本的元素之一&#xff0c;它可以接收用户输入的数据&#xff0c;并通过…

Python 笔记03(多线程)

一 打开命令行&#xff0c;查看本机IP windows r 命令行输入&#xff1a;cmd ipconfig 然后查看IPv4的地址&#xff1a;192.168.1*6.1 ipconfig 二 函数式多进程 from multiprocessing import Process import os, timedef func(name):print(进程的ID&#xff1a;, os.g…

大数据时代,数据治理

一、大数据时代还需要数据治理吗&#xff1f; 数据平台发展过程中随处可见的数据问题 大数据不是凭空而来&#xff0c;1981年第一个数据仓库诞生&#xff0c;到现在已经有了近40年的历史&#xff0c;相对数据仓库来说我还是个年轻人。而国内企业数据平台的建设大概从90年代末…

Docker 自动化部署(保姆级教程)

Docker 自动化部署 1. jenkins 介绍1.1 参考链接&#xff1a;1.2 jenkins 概述1.3 jenkins部署项目的流程 2. jenkins 安装2.1 基于docker 镜像2.2 启动 jenkins 后端服务2.3 登录 jenkins 服务后端 3. jenkins自动化部署开始3.1 下载需要的插件3.2 创建任务3.2.1 描述3.2.2 配…

使用bash脚本编译Qt工程

最近在搭建Qt工程的编译服务器&#xff0c;需要通过shell脚本执行工程的编译过程&#xff0c;写在这里&#xff0c;总结最近的工作。 1. 构建过程 以Windows为例&#xff0c;在QtCreator中左侧选择“项目”便可以看到编译的指令和参数&#xff0c;这些操作也会在我们点击“构建…

git管理常用命令

1、下载代码 git clone 地址2、软件代码提交 1、查看工程中被修改的文件&#xff1a;git status 2.将不需要提交的文件回退&#xff1a;git check <文件路径> 3.更新工程到最新&#xff1a;git pull 4.将本地代码添加到暂存区&#xff1a;git add <将要提交的文件路…

CAN总线数据链路层

CAN报文帧种类: 数据帧:用于发送节点向接收节点传送数据,是使用最多的帧类型远程帧:用于接收节点向某个发送节点请求数据错误帧:用于当某节点检测出错误时向其他节点通知错误的帧过载帧:用于接收节点向发送节点通知自身接收能力的帧帧间隔:将数据帧或远程帧与前面的帧分…

MySQL学习笔记14

MySQL查询之多表查询&#xff1a;&#xff08;了解&#xff09;但是还是要掌握比较好。 1、什么是多表查询&#xff1f; 查询五子句是单表查询&#xff0c;实际工作中&#xff0c;也可能会接触到一个复杂的多表查询。 2、Union 联合查询&#xff1a; union联合查询的作用&…

ElementUI之首页导航与左侧菜单

目录 一、Mock 1.1 什么是Mock.js 1.2 安装与配置 1.2.1 安装mock.js 1.2.2 引入mock.js 1.3 mock.js使用 1.3.1 定义测试数据文件 1.3.2 mock拦截Ajax请求 1.3.3 界面代码优化 二、总线 2.1 定义 2.2 类型分类 2.3 前期准备 2.4 配置组件与路由关系 2.4.1 配置…

Java8实战-总结35

Java8实战-总结35 重构、测试和调试使用 Lambda 重构面向对象的设计模式工厂模式 测试 Lambda 表达式测试可见 Lambda 函数的行为测试使用 Lambda 的方法的行为将复杂的 Lambda 表达式分到不同的方法高阶函数的测试 重构、测试和调试 使用 Lambda 重构面向对象的设计模式 工厂…

JSON数据获取指南!

在互联网时代&#xff0c;数据是金钱的来源。然而&#xff0c;要从海量的网页中提取需要的数据并不容易。本文将带你了解如何使用Node.js编写简易爬虫程序&#xff0c;帮助你轻松获取并处理JSON数据&#xff0c;让你不再为数据发愁。 一、准备工作 安装Node.js&#xff1a;确保…

如何在控制台打印sql语句

步骤一&#xff1a; log4j2.xml中做以下配置 <logger name"xxx.infrastructure.mysql.mapper"level"debug" additivity"false"><appender-ref ref"Console"/></logger>步骤二&#xff1a;IDEA下载Free Mybatis Plu…

9、JavaSE总结

9、JavaSE总结 9.1 Java语言 9.1.1 MarkDown语法 9.1.2 简单的Dos命令 9.1.3计算机语言发展 9.1.4 Java的诞生 1995年诞生&#xff1a;JavaSE、JavaME、JavaEE 2006年Hadoop大数据系列 9.1.5 JDK、JRE JDK&#xff1a;开发者工具包、配置环境变量&#xff08;配置Java…

Vue Mock.js介绍和使用与首页导航栏左侧菜单搭建

前言&#xff1a; 因为使用Vue开发&#xff0c;组件写的太多&#xff0c;组件与组件之间的传递数据复杂&#xff0c;所以要用到Mock和Bus事件 一&#xff0c;关于Mock 1.1.什么是Mock.js Mock.js是一个模拟数据的生成器&#xff0c;用来帮助前端调试开发、进行前后端的原型分离…

upload-labs靶场未知后缀名解析漏洞

upload-labs靶场未知后缀名解析漏洞 版本影响&#xff1a; phpstudy 版本&#xff1a;5.2.17 ​ 1 环境搭建 1.1 在线靶场下载&#xff0c;解压到phpstudy的www目录下&#xff0c;即可使用 https://github.com/c0ny1/upload-labs1.2 已启动&#xff1a;访问端口9000&…

似然和概率

前言 高斯在处理正态分布的首次提出似然&#xff0c;后来英国物理学家&#xff0c;费歇尔 概率是抛硬币之前&#xff0c;根据环境推断概率 似然则相反&#xff0c;根据结果推论环境 P是关于x的函数&#xff0c;比如x为正面朝上的结果&#xff0c;或者反面朝上的结果&#xf…

数据大爆炸:大数据分析如何改变我们的世界

文章目录 大数据分析的基本概念数据的三个V大数据分析的技术 大数据分析在商业中的应用1. 个性化营销2. 风险管理3. 供应链优化4. 客户服务 大数据分析在医疗保健中的应用1. 疾病预测2. 患者治疗3. 医疗设备监控 大数据分析在科学研究中的应用1. 天文学2. 生物学3. 气象学 大数…

如何搭建自己的gitlab服务器

这里使用Termus工具连接服务器&#xff0c;然后根据步骤走即可&#xff01; 安装 1.配置yum源安装gitlab vim /etc/yum.repos.d/gitlab-ce.repo修改或新增下面配置并保存 [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum…