我正在重复另一个论坛的问题,因为我想要相同的答案。
来自 MSDN 的 SwapMouseButton 函数.
如何通过 rundll32.exe 将布尔数据从命令提示符传递到从 user32.dll 运行的命令中的布尔类型参数?
我正在尝试从 CMD(命令提示符)运行它
RUNDLL32.EXE user32.dll,SwapMouseButton *
这里有星号的地方就是论点应该去的地方。我已经在没有参数的情况下运行它并且它交换了我的鼠标左键和右键(似乎 TRUE 是布尔参数的默认条目)。现在我想撤消它。 但是,我已经尝试了其中的每一个以在参数中传递 FALSE,但没有一个起作用(没有将我的鼠标按钮设置回正常状态)。
- F
- f
- 假
- 假
- 假
- “假”
- “假”
- “假”
- 0
- -1
请根据需要帮助我通过论证。提前致谢。
非常感谢 C# 解决方案。它就像一个魅力。
我做了一个小改动,这样我就可以简单地点击桌面快捷方式来切换主鼠标按钮,而不需要传递参数。如果我的方法对其他人有帮助,这里是那个版本:
using System.Runtime.InteropServices;
using System;
class SwapMouse
{
[DllImport("user32.dll")]
public static extern Int32 SwapMouseButton(Int32 bSwap);
static void Main(string[] args)
{
int rightButtonIsAlreadyPrimary = SwapMouseButton(1);
if (rightButtonIsAlreadyPrimary != 0)
{
SwapMouseButton(0); // Make the left mousebutton primary
}
}
}
你不为此使用
rundll32
。
Q164787: 信息:Windows Rundll 和 Rundll32 接口
[...] Rundll 和 Rundll32 程序不允许您从任何 DLL 调用任何导出函数。例如,您不能使用这些实用程序来调用从系统 DLL 导出的 Win32 API(应用程序编程接口)调用。这些程序只允许您从 DLL 调用函数,这些函数明确编写为由它们调用。
如果安装了 .NET Framework Runtime,它会附带多种语言的编译器(例如,
%SystemRoot%\Microsoft.NET\Framework64\v3.5\csc.exe
用于 64 位系统上的 v3.5 C# 编译器)。你可以用C#写程序:
using System.Runtime.InteropServices;
using System;
class SwapMouse {
[DllImport("user32.dll")]
public static extern Int32 SwapMouseButton(Int32 bSwap);
static void Main(string[] args) {
if (args.Length > 0 && String.Compare(args[0], "/u", true) == 0)
SwapMouseButton(0);
else
SwapMouseButton(1);
}
}
编译:
"%SystemRoot%\Microsoft.NET\Framework64\v3.5\csc" swap.cs
交换/取消交换按钮:
swap
swap /u
有hack,可用于为左撇子用户配置鼠标布局。 只需运行以下命令:
rundll32.exe user32.dll,SwapMouseButton
运行此命令为惯用左手的用户重新配置鼠标布局。
我要给你解释这种行为:
rundll32.exe调用的函数,函数原型如下:
void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
SwapMouseButton 有如下函数原型:
BOOL WINAPI SwapMouseButton(
_In_ BOOL fSwap
)
SwapMouseButton 使用与 rundll32.exe 调用的每个函数相同的调用约定 (__stdcall)。
如果您使用带有附加命令行的 rundll32.exe 调用 SwapMouseButton,此命令行将作为 lpszCmdLine 传递给此函数,并将被忽略。
如果您使用 rundll32 调用该函数,rundll32 会自动传递一个有效的窗口句柄 (HWND) 作为被调用函数的第一个参数。
hwnd - 应该用作所有者窗口的窗口句柄 您的 DLL 创建的任何窗口
rundll32 调用的函数 SwapMouseButton 函数需要 TRUE 作为第一个参数,以便为左手用户配置鼠标布局。 rundll32.exe 传递给 user32.dll 中的 SwapMouseButton 的有效窗口句柄不等于 0,并且在使用 BOOL 值时定义为 TRUE。
您可以在此处找到有关 rundll32.exe 的详细信息以及此可执行文件调用的函数使用的原型: 信息:Windows Rundll 和 Rundll32 接口
您可以在此处找到有关函数 SwapMouseButton 的详细信息: SwapMouseButton 函数 (Windows)
C 中更短的交换器:
#include <windows.h>
int main()
{
if (SwapMouseButton(TRUE))
SwapMouseButton(FALSE);
return 0;
}
通过例如 x86_x64 交叉工具命令提示符安装 Windows SDK 和编译。
cl swapmbtn.c "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x64\user32.lib"
将
main
重命名为WinMain
以防止控制台窗口闪烁。
这是一个简单的 C/C++ Windows 应用程序的代码:
// SwapMouseButtons.cpp - Inversion of mouse buttons
#include <Windows.h>
#include <iostream>
#include <WinUser.h>
#include <string.h>
void main(int nArgs, char* szArguments[])
{
if (nArgs > 1 && (_strcmpi(szArguments[1], "FALSE") == 0 || _strcmpi(szArguments[1], "F") == 0
|| _strcmpi(szArguments[1], "RIGHT") == 0 || _strcmpi(szArguments[1], "R") == 0
|| _strcmpi(szArguments[1], "0") == 0)) { // Right handed
SwapMouseButton(false);
std::cout << "Mouse buttons set for Right handed (default) usage\n";
return;
}
if (nArgs > 1 && (_strcmpi(szArguments[1], "TRUE") == 0 || _strcmpi(szArguments[1], "T") == 0
|| _strcmpi(szArguments[1], "LEFT") == 0 || _strcmpi(szArguments[1], "L") == 0
|| _strcmpi(szArguments[1], "1") == 0)) { // Left handed
SwapMouseButton(true);
std::cout << "Mouse buttons set for Left handed (inverted) usage\n";
return;
}
// No option selected => help
std::cout << "Swap Mouse Buttons\nUsage: SwapMouseButtons x\nOptions for x:\n - False, F, Right, R or 0 for left handed usage (default usage)\n - True, T, Left, L or 1 for right handed usage (inverted usage)\n\n";
}
编译版本(x86)可以在这里找到:http://micromeg.free.fr/english/progs.html
我通过在开始菜单中搜索“鼠标”解决了同样的问题。您会找到一个同名的选项。点击它。将出现一个对话框。在带有“按钮配置”框的按钮选项卡中取消选中“切换主按钮和辅助按钮”选项。
• 如何从 /dev/input/mice 读取鼠标按钮状态?
• 为什么 xmodmap 在使用它来禁用按下的鼠标按钮时挂起?
• 使用鼠标滚动事件触发 Bootstrap off canvas
• 在 Pygame 中将鼠标悬停在按钮上时光标不会改变 [重复]
• 如何使用 unput 标签中的一个提交按钮而不是按钮标签
• 我能否以 `myDirective('p')` 的形式创建一个 Angular 结构指令,将值从 HMTL 视图传递给指令?
• 我们如何使用 react-native-keyboard-controller 库来自定义键盘上的按钮?
• 如何在 NSTextAttachmentCell 上获取鼠标跟踪和单击事件?
• 如何在 Unity 中修复 NullReferenceException?无法通过鼠标左键单击接近玩家与对象交互