Qt第三方库QHotKey设置小键盘数字快捷键

news2024/12/23 15:34:26

一、看了一圈没有找到可以设置小键盘的情况。

这两天在研究快捷键的使用。发现qt的里的快捷键不是全局的。找了两个第三方快捷键QHotKey,还有一个QxtGlobalShortcut。但是这两个都不能设置小键盘的数字。

比如QKeySequenceEdit (Ctrl+1) 这个快捷键,这个1只会响应主键盘的数字1对应的键盘码是0x31.而小键盘的1键盘码是0x61.

所以就算是设置成功了,再按快捷键的时候也是响应的主键盘的,按小键盘没用。

二、准备工作

0、键盘码对应关系

 Qt中的Qt::key0-9 对应的是0x30-0x39

  windows 下 主键盘上的数字0-9对应的是0x30-0x39 刚好和qt的一致。

     windwos下 小键盘上的数字0-9对应的键盘码是0x60-0x69.

看了Qt的Qt::key 枚举发现并没有 VK_NUMPAD0=0x60的枚举值。

仅有的0x60也是对应 Qt::Key_QuoteLeft并不是对应的小键盘的VK_NUMPAD0, 0x61-0x69是缺失状态。

还有一点需要注意的是,在看qt枚举的时候,发现在键盘(NumLock)不选中的情况下的小键盘0-9的码值。

对应的QKeySequenceEdit表现为:

alt+1->

alt+9->         

其他的可以自己试试。但是这个不是我想要的。

三、初步思考

是不是qt没有枚举全windows键盘码,导致第三方库都办法响应小键盘的0-9?如果我把小键盘码搞进去是不是就能响应了?

接下来就查看源码。

四、源码解析,初步分析

在注册快捷键的时候用的是这两个函数 setShortcut 以及他的重载。


//! A class to define global, systemwide Hotkeys
class QHOTKEY_SHARED_EXPORT QHotkey : public QObject
{
	Q_OBJECT
	friend class QHotkeyPrivate;

	//! Specifies whether this hotkey is currently registered or not
	Q_PROPERTY(bool registered READ isRegistered WRITE setRegistered NOTIFY registeredChanged)
	//! Holds the shortcut this hotkey will be triggered on
	Q_PROPERTY(QKeySequence shortcut READ shortcut WRITE setShortcut RESET resetShortcut)

public:
	//! Defines shortcut with native keycodes
	class QHOTKEY_SHARED_EXPORT NativeShortcut {
	public:
		//! The native keycode
		quint32 key;
		//! The native modifiers
		quint32 modifier;

		//! Creates an invalid native shortcut
		NativeShortcut();
		//! Creates a valid native shortcut, with the given key and modifiers
		NativeShortcut(quint32 key, quint32 modifier = 0);

		//! Checks, whether this shortcut is valid or not
		bool isValid() const;

		//! Equality operator
		bool operator ==(const NativeShortcut &other) const;
		//! Inequality operator
		bool operator !=(const NativeShortcut &other) const;

	private:
		bool valid;
	};

	//! Constructor
	explicit QHotkey(QObject *parent = Q_NULLPTR);
	//! Constructs a hotkey with a shortcut and optionally registers it
	explicit QHotkey(const QKeySequence &shortcut, bool autoRegister = false, QObject *parent = Q_NULLPTR);
	//! Constructs a hotkey with a key and modifiers and optionally registers it
	explicit QHotkey(Qt::Key keyCode, Qt::KeyboardModifiers modifiers, bool autoRegister = false, QObject *parent = Q_NULLPTR);
	//! Constructs a hotkey from a native shortcut and optionally registers it
	explicit QHotkey(const NativeShortcut &shortcut, bool autoRegister = false, QObject *parent = Q_NULLPTR);
	//! Destructor
	~QHotkey();

	//! READ-Accessor for QHotkey::registered
	bool isRegistered() const;
	//! READ-Accessor for QHotkey::shortcut - the key and modifiers as a QKeySequence
	QKeySequence shortcut() const;
	//! READ-Accessor for QHotkey::shortcut - the key only
	Qt::Key keyCode() const;
	//! READ-Accessor for QHotkey::shortcut - the modifiers only
	Qt::KeyboardModifiers modifiers() const;

	//! Get the current native shortcut
	NativeShortcut currentNativeShortcut() const;

public slots:
	//! WRITE-Accessor for QHotkey::registered
	bool setRegistered(bool registered);

	//! WRITE-Accessor for QHotkey::shortcut
	bool setShortcut(const QKeySequence &shortcut, bool autoRegister = false);

	//! WRITE-Accessor for QHotkey::shortcut
	bool setShortcut(Qt::Key keyCode, Qt::KeyboardModifiers modifiers, bool autoRegister = false);
	//! RESET-Accessor for QHotkey::shortcut
	bool resetShortcut();

	//! Set this hotkey to a native shortcut
	bool setNativeShortcut(NativeShortcut nativeShortcut, bool autoRegister = false);

signals:
	//! Will be emitted if the shortcut is pressed
	void activated(QPrivateSignal);

	//! NOTIFY-Accessor for QHotkey::registered
	void registeredChanged(bool registered);

private:
	Qt::Key _keyCode;
	Qt::KeyboardModifiers _modifiers;

	NativeShortcut _nativeShortcut;
	bool _registered;
};

挑一个看看源码

bool QHotkey::setShortcut(const QKeySequence &shortcut, bool autoRegister)
{
	if(shortcut.isEmpty()) {
		return resetShortcut();
	} else if(shortcut.count() > 1) {
		qCWarning(logQHotkey, "Keysequences with multiple shortcuts are not allowed! "
							  "Only the first shortcut will be used!");
	}

	return setShortcut(Qt::Key(shortcut[0] & ~Qt::KeyboardModifierMask),
			Qt::KeyboardModifiers(shortcut[0] & Qt::KeyboardModifierMask),
			autoRegister);
}

发现也是解析出来key(0-9 a-z) 和 组合键。(ctrl shift alt ...)

然后调用了 setShortCut.


bool QHotkey::setShortcut(Qt::Key keyCode, Qt::KeyboardModifiers modifiers, bool autoRegister)
{
	if(_registered) {
		if(autoRegister) {
			if(!QHotkeyPrivate::instance()->removeShortcut(this))
				return false;
		} else
			return false;
	}

	if(keyCode == Qt::Key_unknown) {
		_keyCode = Qt::Key_unknown;
		_modifiers = Qt::NoModifier;
		_nativeShortcut = NativeShortcut();
		return true;
	}

	_keyCode = keyCode;
	_modifiers = modifiers;
	_nativeShortcut = QHotkeyPrivate::instance()->nativeShortcut(keyCode, modifiers);
	if(_nativeShortcut.isValid()) {
		if(autoRegister)
			return QHotkeyPrivate::instance()->addShortcut(this);
		else
			return true;
	} else {
		qCWarning(logQHotkey) << "Unable to map shortcut to native keys. Key:" << keyCode << "Modifiers:" << modifiers;
		_keyCode = Qt::Key_unknown;
		_modifiers = Qt::NoModifier;
		_nativeShortcut = NativeShortcut();
		return false;
	}
}

看了这两个函数就知道了。问题肯定是出在这里了。解析完是Qt::key 然而Qt::key中并没有小键盘的数字。所以?? 那是肯定不会响应的。

那么问题来了,怎么解决。

我的方法简单粗暴。直接把VK_NUMPAD0-9 强制转换成 Qt::key 但是这种会覆盖那个Qt::key中的0x60(Qt::Key_QuoteLeft) ,但是不管了。先搞再说。

于是我测试了一下:

QKeySequence keySequenceFromString = (QKeySequence(Qt::CTRL , Qt::ALT , VK_NUMPAD1));

m_pMousePointGetHot->setShortcutEx(keySequenceFromString, true))

发现不行会出错。

Keysequences with multiple shortcuts are not allowed! "  "Only the first shortcut will be used!

这两句话就是在解析的时候 之后调用setShortcut的时候 函数头出现的。意思很清晰。

到这里。麻了。难道思路有问题。

于是我看到了第二个setShortcut函数。

bool QHotkey::setShortcut(Qt::Key keyCode, Qt::KeyboardModifiers modifiers, bool autoRegister)

上面的图片有内容。

我想着抛弃Qt::key中的0-9数字,把他转换成VK_NUMPAD0-9。搞个转换函数强制塞进去试试


Qt::Key TransNumToPadNum(const Qt::Key k)
{
	switch (k)
	{
	case Qt::Key_0:
		return Qt::Key(VK_NUMPAD0);
		break;
	case Qt::Key_1:
		return Qt::Key(VK_NUMPAD1);
		break;
	case Qt::Key_2:
		return Qt::Key(VK_NUMPAD2);
		break;
	case Qt::Key_3:
		return Qt::Key(VK_NUMPAD3);
		break;
	case Qt::Key_4:
		return Qt::Key(VK_NUMPAD4);
		break;
	case Qt::Key_5:
		return Qt::Key(VK_NUMPAD5);
		break;
	case Qt::Key_6:
		return Qt::Key(VK_NUMPAD6);
		break;
	case Qt::Key_7:
		return Qt::Key(VK_NUMPAD7);
		break;
	case Qt::Key_8:
		return Qt::Key(VK_NUMPAD8);
		break;
	case Qt::Key_9:
		return Qt::Key(VK_NUMPAD9);
		break;
	default:
		return k;
		break;
	}
}

雅黑,可以了,发现不报错了。

但是快捷键按键没有效果....

于是就跟进去看看里面的源码:可以跟着看。

QHotkey::setShortcut  ->

QHotkeyPrivate::instance()->nativeShortcut  ->  这里判断了按键是否有效。

QHotkeyPrivate::nativeShortcutInvoked->

QHotkey::NativeShortcut QHotkeyPrivate::nativeShortcutInvoked(Qt::Key keycode, Qt::KeyboardModifiers modifiers)
{
	bool ok1, ok2 = false;
	auto k = nativeKeycode(keycode, ok1);
	auto m = nativeModifiers(modifiers, ok2);
	if(ok1 && ok2)
		return {k, m};
	else
		return {};
}

到这里已经大致知道什么原因了。

在转换的时候 ok1是false的。就看看nativeKeycode:

这里就是根源了。他把qt的key对应起来windows的键盘码做了一个转换。问题找到了。

就是在这里地方。还是因为qt里的qt::key 没有小键盘。所以根本不可能映射。

于是我修改了一下这个对应关系,新增VK_NUMPAD0-9。

quint32 QHotkeyPrivateWin::nativeKeycode(Qt::Key keycode, bool &ok)
{
	ok = true;
	switch (keycode)
	{
	case VK_NUMPAD0:
	case VK_NUMPAD1:
	case VK_NUMPAD2:
	case VK_NUMPAD3:
	case VK_NUMPAD4:
	case VK_NUMPAD5:
	case VK_NUMPAD6:
	case VK_NUMPAD7:
	case VK_NUMPAD8:
	case VK_NUMPAD9:
		return keycode;
	default:
		break;
	}
	if(keycode <= 0xFFFF) {//Try to obtain the key from it's "character"
		const SHORT vKey = VkKeyScanW(keycode);
		if(vKey > -1)
			return LOBYTE(vKey);
	}

	//find key from switch/case --> Only finds a very small subset of keys
	switch (keycode)
    ...

}

这样外面的key如果是小键盘的话就不会出错了。

再次测试。响应了,他可以了。完美,牛逼!!!

QKeySequence keySequenceFromString = "Ctrl+Alt+1";

Qt::Key keyCode = Qt::Key(k[0] & ~Qt::KeyboardModifierMask);
		Qt::KeyboardModifiers modifiers = Qt::KeyboardModifiers(k[0] & Qt::KeyboardModifierMask);
keyCode = ui.keySequenceEdit->TransNumToPadNum(keyCode);
QKeySequence ktmpex(keyCode, modifiers);
ktmp = ktmpex;
// 报错Keysequences with multiple shortcuts are not allowed! "
// "Only the first shortcut will be used!
//m_pMousePointGetHot->setShortcutWithPad(ktmp, true);
m_pMousePointGetHot->setShortcut(keyCode, modifiers, true);

// 这里要把组合键和单键摘出来,调用另外一个setShortCut

五、封装以及整理。

 在qhotkey.h中我新建一个注册快捷键的函数(其实搞了两个,但是用的是红色圈住的)

实现如下:这里有个弊端就是小键盘的字符必须

/*
	包含小键盘数字, 但是小键盘数字仅作为最后一个快捷按键使用
*/
bool QHotkey::setShortcutWithPad(const QKeySequence& shortcut, bool autoRegister) {
	if (shortcut.isEmpty()) {
		return resetShortcut();
	}
	else if (shortcut.count() > 1) {
		qCWarning(logQHotkey, "Keysequences with multiple shortcuts are not allowed! "
			"Only the first shortcut will be used!");
	}
	 // 小键盘数字
	quint32 keyCode = shortcut[shortcut.count() -1];
	
	return setShortcut((Qt::Key)keyCode,
		Qt::KeyboardModifiers(shortcut[0] & Qt::KeyboardModifierMask),
		autoRegister);
}

直接用这个bool setShortcut(const QKeySequence &shortcut, bool autoRegister = false);这个函数也行,但是传递keycode的时候要传递 小键盘的0-9 VK_NUMPAD0-9。

由于Qt里是用的QKeySequenceEdit,但是他无法键入小键盘的keycode.所以重新简单集成封装一下:

CustomKeySeqEdit.h

#pragma once

#include <QKeySequenceEdit>
#include <QKeyEvent>

class CustomKeySeqEdit  : public QKeySequenceEdit
{
	Q_OBJECT

public:
	CustomKeySeqEdit(QWidget *parent);
	~CustomKeySeqEdit();
	void setKeyNumPadNumber(bool b);
	bool isKeyNumPadNumber();
	Qt::Key TransNumToPadNum(const Qt::Key k);
private:
	void keyPressEvent(QKeyEvent* e) override;
	//virtual bool nativeEvent(const QByteArray& eventType, void* message, long* result);
private:
	bool m_isNumPad = false;
};

CustomKeySeqEdit.cpp

#include "CustomKeySeqEdit.h"
#include <windows.h>
#include <windowsx.h>  //提供消息关键字的识别


CustomKeySeqEdit::CustomKeySeqEdit(QWidget *parent)
	: QKeySequenceEdit(parent)
{
	//this->installEventFilter(this);
}

CustomKeySeqEdit::~CustomKeySeqEdit()
{}

void CustomKeySeqEdit::setKeyNumPadNumber(bool b)
{
	m_isNumPad = b;
}

bool CustomKeySeqEdit::isKeyNumPadNumber()
{
	return m_isNumPad;
}

// 这个很垃圾,不应该放在这里。但是为了测试快些就随便放了
Qt::Key CustomKeySeqEdit::TransNumToPadNum(const Qt::Key k)
{
	switch (k)
	{
	case Qt::Key_0:
		return Qt::Key(VK_NUMPAD0);
		break;
	case Qt::Key_1:
		return Qt::Key(VK_NUMPAD1);
		break;
	case Qt::Key_2:
		return Qt::Key(VK_NUMPAD2);
		break;
	case Qt::Key_3:
		return Qt::Key(VK_NUMPAD3);
		break;
	case Qt::Key_4:
		return Qt::Key(VK_NUMPAD4);
		break;
	case Qt::Key_5:
		return Qt::Key(VK_NUMPAD5);
		break;
	case Qt::Key_6:
		return Qt::Key(VK_NUMPAD6);
		break;
	case Qt::Key_7:
		return Qt::Key(VK_NUMPAD7);
		break;
	case Qt::Key_8:
		return Qt::Key(VK_NUMPAD8);
		break;
	case Qt::Key_9:
		return Qt::Key(VK_NUMPAD9);
		break;
	default:
		return k;
		break;
	}
}

#include <QDebug>
void CustomKeySeqEdit::keyPressEvent(QKeyEvent* e)
{
	if (e->key() < Qt::Key_0 || e->key() > Qt::Key_9) {
		return QKeySequenceEdit::keyPressEvent(e);
	}
	// 我们只关心小键盘
	int keyCode = e->nativeVirtualKey();
	m_isNumPad = false;
	qDebug() <<"key:" << e->key()   << keyCode;
	if (keyCode >= 0x60 && keyCode <= 0x69) {
		m_isNumPad = true;
	}
	QKeySequenceEdit::keyPressEvent(e);

}
/*  这个不行,不会响应。
bool CustomKeySeqEdit::nativeEvent(const QByteArray& eventType, void* message, long* result)
{
	MSG* msg = static_cast<MSG*>(message);
	switch (msg->message)
	{
	case WM_KEYDOWN:
	{
		m_isNumPad = false;
		int value = msg->wParam;
		if (value >= VK_NUMPAD0 && value <= VK_NUMPAD9) {
			m_isNumPad = true;
		}
	}
		break;
	default:
		break;
	}

	return false;
}
*/

使用:

至此,算是愉快结束了。 可以用QKeySequenceEdit使用小键盘的数字了。

可以正常拾取坐标啦!!!

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

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

相关文章

java第二十四课 —— super 关键字 | 方法重写

super 关键字 基本介绍 super 代表父类的引用&#xff0c;用于访问父类的属性、方法、构造器。 基本语法 访问父类的属性&#xff0c;但不能访问父类的 private 属性。 super.属性名; 访问父类的方法&#xff0c;不能访问父类的 private 方法。 super.方法名(参数列表); 访…

每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割

本文重点 在深度学习中,我们常常需要完成多个向量拼接,同时也要完成向量的分割,在pytorch中已经有封装好的库,我们可以直接调用完成这部分任务。 Cat拼接 c=torch.cat([a,b],dim=0)表示将a和b按0维度进行拼接,需要注意再非dim维度,两个矩阵的维度必须是一致的,不然会拼…

01 飞行器设计 —— 一门独立的学科

01 飞行器设计 —— 一门独立的学科 01 引言02 飞机设计概述2-1 什么是飞机设计&#xff1f;2-1 飞机设计是从哪里开始的&#xff1f;2-2 如何成为一名飞机设计师&#xff1f;2-4 本书的组织 参考文献 说明&#xff1a;关于Raymer的《Aircraft Design》的读书笔记&#xff1b; …

【数字化转型,从BI开始】论BI在数字化转型的作用

引言&#xff1a;在新的市场和用户需求、传统经济增长缓慢、疫情黑天鹅事件等多重因素的影响下&#xff0c;企业遭遇了集体性的困境&#xff0c;而数字化转型就是各领域企业寻找出的应对方式。数字化转型包含的三维度之一数据力&#xff0c;就包含数据治理和数据分析&#xff0…

第 4 章:从 Spring Framework 到 Spring Boot

通过前面几个章节的介绍&#xff0c;相信大家已经对 Spring Framework 有了一个基本的认识&#xff0c;相比早期那些没有 Spring Framework 加持的项目而言&#xff0c;它让生产力产生了质的飞跃。但人们的追求是无止境的&#xff0c;这也驱动着技术的发展。开发者认为 Spring …

浅谈配置元件之Java默认请求

浅谈配置元件之Java默认请求 1.简介 “Java默认请求”&#xff08;虽然直接名为"Java Request"更常见&#xff09;是一个高级配置元件&#xff0c;它允许用户通过Java代码自定义请求逻辑&#xff0c;为测试提供了极高的灵活性和扩展性。 2.Java请求组件概述 在JM…

MYSQL、ORACLE、PostgreSQL数据库对象层次及权限管理对比

文章目录 前言一、PostgreSQL二、MySQL三、Oracle 前言 本文为出于自己扩展、比较、图形化的思维路径自行总结归纳&#xff0c;可能有些细节不太准确&#xff0c;欢迎指正。 MySQL、Oracle、PostgreSQL关系型数据库都有管理员用户、用户、权限管理、表函数索引等数据库对象&am…

Python学习笔记10:入门知识(十)

函数 什么是函数 简单来说就是具备某些特定功能的带有名称的代码块。比如之前我们讲过的列表的增删改查函数&#xff0c;排序函数等等。 函数的作用 代码复用。函数作为具备某些特定功能的代码块&#xff0c;当你的程序需要多次使用同一段业务逻辑的时候&#xff0c;使用函…

KT-H6测距模块标品,测距范围1500m,demo报价1000RMB,批量报价500RMB

激光测距传感器是一种用于测量距离的模块,通常由传感器和相关电子设备组成,测距模块可以集成到各种设备和系统中,以实现准确的测距和定位功能。KT-H6系列激光测距模块,为自主研发,激光波长905nm的激光器,专为热成像、夜视仪、无人机、安防、瞄具等产品定身打造,其优点是…

msvcp120.dll丢失原因分析与解决方法分享

msvcp120.dll 是一个动态链接库&#xff08;Dynamic Link Library, DLL&#xff09;&#xff0c;属于 Microsoft Visual C 2013 再发行组件包的一部分。它提供了 C 标准库的实现&#xff0c;使得使用 C 编写的应用程序能够在运行时动态链接到该库&#xff0c;从而访问其提供的函…

头歌资源库(6)汉诺塔(递归)

一、 问题描述 二、算法思想 首先定义一个函数&#xff0c;接收四个参数&#xff1a;n表示当前需要移动的盘子数量&#xff0c;A表示起始基座&#xff0c;B表示目标基座&#xff0c;C表示辅助基座。 在函数内部&#xff0c;首先判断如果n为1&#xff0c;即只有一个盘子需要…

父亲节 | 10位名家笔下的父亲,读懂那份孤独而深沉的父爱

Fathers Day 母爱如水&#xff0c;父爱如山。 相对于母爱的温柔&#xff0c;父亲的爱多了几分静默和深沉。 读完10位名家笔下的父亲&#xff0c;我们就会明白&#xff0c;到底亏欠了父亲多少。 不要让自己有“子欲养而亲不待”的后悔和遗憾&#xff0c; 多给父亲一些爱的表示&a…

项目进度和成本管理

1.如何正确标识出软件项目活动&#xff1f; 正确标识软件项目活动是项目管理中的一个重要步骤&#xff0c;它有助于确保项目的顺利进行和成功完成。以下是一些标识软件项目活动的步骤和建议&#xff1a; 项目范围定义&#xff1a;首先明确项目的目标和范围&#xff0c;这将帮助…

某集团数字化转型蓝图规划项目案例(94页PPT)

案例介绍&#xff1a; 本集团数字化转型蓝图规划项目通过确定目标&#xff0c;如制定集团数字化转型的整体战略和规划&#xff0c;明确转型方向和目标。构建数字化业务体系&#xff0c;实现业务流程数字化、智能化。搭建数字化管理平台&#xff0c;提升集团内部的管理效率和决…

c语言——扫雷游戏(简易版)

目录 前言游戏设计 前言 什么是扫雷游戏&#xff1f; 游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷&#xff0c;踩到一个雷即全盘皆输。 这个游戏对于c语言的初学者来说难度还是挺大的&#xff0c;那我就实现一个初学者也能快速学…

C++ 55 之 多继承

#include <iostream> #include <string> using namespace std;class Base08_1{ public:int m_a;Base08_1(){this->m_a 10;} };class Base08_2{ public:// int m_b;int m_a;Base08_2(){// this->m_b 20;this->m_a 30;} };// 多继承 继承的类型都要…

sort使用

具体使用 bool myfunction(int i, int j) { return (i < j); }class my_function { public:bool operator()(int i, int j) { return (i < j); } }; int main() {int array[] { 4,1,8,5,3,7,0,9,2,6 };// 默认按照小于比较&#xff0c;排出来结果是升序std::sort(array…

汉邦高科防监控初始化恢复方法

汉邦高科算是安防市场上的三线品牌&#xff0c;产品不算多&#xff0c;但在某些地域有一定的市场份额。下面我们看下汉邦高科安防监控格式化后如何恢复数据&#xff1a; 故障存储:ST300VM002 故障现象: 由于各种原因录像机被初始化&#xff0c;导致数据全部丢失&#xff0c;…

逻辑斯蒂回归与最大熵

知识树 感知机的缺陷 修补感知机缺陷-逻辑斯蒂回归 下面这两个值是强制给的,不是推导的 最大熵 最大熵的一个小故事 最大熵模型 我们最终目标是要求P(Y|X) 书上写的是H,但是2我们认为H(Y|X)更合适 咱们最终的目的是要用拉格朗日乘数法,所以需要约束 总结 感觉深度之眼比较模…

xinput1_3.dll怎么安装,关于xinput1_3.dll的多种修复方法分享

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“找不到xinput1_3.dll”。那么&#xff0c;xinput13.dll到底是什么&#xff1f;为什么会出现找不到的情况&#xff1f;它对电脑有什么影响&#xff1f;本文将为您详细解析xinput1_3.dll的含义…