【问题标题】:How do I use Rundll32 to swapmousebutton?如何使用 Rundll32 交换鼠标按钮?
【发布时间】:2011-06-15 22:45:40
【问题描述】:

我正在重复另一个论坛的问题,因为我想要相同的答案。

来自 MSDN 的 SwapMouseButton Function

如何通过 rundll32.exe 将布尔数据从命令提示符传递到从 user32.dll 运行的命令中的布尔类型参数?

我正在尝试从 CMD(命令提示符)运行它

RUNDLL32.EXE user32.dll,SwapMouseButton *

这里的星号是参数应该放在哪里。我已经在没有参数的情况下运行了它,它交换了我的鼠标左键和右键(似乎 TRUE 是布尔参数的默认条目)。现在我想撤消它。 但是,我已经尝试了其中的每一个来在参数中传递 FALSE,但都没有奏效(没有一个将我的鼠标按钮设置回正常状态)。

  • F
  • f
  • 错误
  • 错误
  • “假”
  • “假”
  • “假”
  • 0
  • -1

请帮助我根据需要传递参数。提前致谢。

【问题讨论】:

  • 我现在不在 Windows 机器上,但您尝试过 1 还是什么都不用?
  • rundll32 始终将参数作为字符串传递,因此在您的情况下,字符串指针!= FALSE = TRUE 到 SwapMouseButtons。 rundll32 不能只是神奇地知道将您的参数解析为整数。

标签: windows mouse rundll32


【解决方案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
        }
    }
}

【讨论】:

    【解决方案2】:

    do not 使用 rundll32

    Q164787: INFO: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# 编译器)。你可以write a program in 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
    

    【讨论】:

      【解决方案3】:

      有 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 和此可执行文件调用的函数使用的原型的详细信息: INFO: Windows Rundll and Rundll32 Interface

      您可以在此处找到有关功能 SwapMouseButton 的详细信息: SwapMouseButton function (Windows)

      【讨论】:

        【解决方案4】:

        C 中一个较短的交换器:

        #include <windows.h>
        
        int main()  
        {
            if (SwapMouseButton(TRUE))
                SwapMouseButton(FALSE);
        
            return 0;  
        }
        

        安装 Windows SDK 并在 x86_x64 交叉工具命令提示符中编译,例如。 cl swapmbtn.c "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x64\user32.lib"

        main 重命名为 WinMain 以防止控制台窗口闪烁。

        【讨论】:

          【解决方案5】:

          我通过在开始菜单中搜索“鼠标”解决了同样的问题。您将找到一个具有相同名称的选项。点击它。将出现一个对话框。在带有“按钮配置”框的按钮选项卡中取消选中“切换主要和次要按钮”选项。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-05
            • 1970-01-01
            • 1970-01-01
            • 2017-02-17
            相关资源
            最近更新 更多