2011-01-24 47 views
5

我從另一個論壇重複一個問題,因爲我想要相同的答案。如何使用Rundll32來切換鼠標?

來自MSDN的SwapMouseButton Function

如何通過rundll32.exe將布爾數據從命令提示符傳遞到從user32.dll運行的命令中的布爾類型參數?

我試圖從CMD(命令提示符)運行此

RUNDLL32.EXE user32.dll,SwapMouseButton * 

其中星號是這裏是哪裏的說法應該去。我已經運行它沒有參數,它交換我的左右鼠標按鈕(似乎TRUE是布爾參數的默認條目)。現在我想撤消它。 但是我已經嘗試了其中的每一個在參數中傳遞FALSE,沒有任何工作(沒有設置我的鼠標按鈕恢復正常)。

  • ˚F
  • ˚F
  • FALSE
  • 「假」
  • 「假」
  • 「FALSE」
  • -1

請幫助我根據需要傳遞參數。提前致謝。

+0

我現在不在Windows機器上,但是你是否嘗試了`1`,或者根本沒有? – 2011-01-24 04:55:22

回答

9

do not使用rundll32

Q164787: INFO:的Windows Rundll的和Rundll32的接口

[...] Rundll的和Rundll32的程序不允許你從任何DLL調用任何導出函數。例如,您不能使用這些實用程序調用從系統DLL導出的Win32 API(應用程序編程接口)調用。這些程序只允許你從一個明確寫入的DLL調用函數來調用它們。


如果您安裝了.NET Framework運行,它帶有幾種語言的編譯器(例如,%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 

交換/ unswap按鈕:

swap 
swap /u 
10

感謝這麼多的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 
     } 
    } 
} 
1

有破解,可以用來配置鼠標的佈局左手用戶。 只要運行以下命令:

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使用相同的調用約定(__stdcall),因爲每個通過RUNDLL32.EXE確實調用的函數。

如果使用帶附加命令行的rundll32.exe調用SwapMouseButton,該命令行將作爲lpszCmdLine傳遞給此函數,並且將被忽略。

如果使用rundll32調用該函數,則rundll32會自動傳遞一個有效的窗口句柄(HWND)作爲被調用函數的第一個參數。

HWND - 這應該作爲所有者窗口 窗口句柄任何Windows的DLL創建

通過RUNDLL32調用的函數SwapMouseButton功能需要TRUE作爲以第一個參數配置鼠標爲佈局左手用戶。當使用BOOL值時,rundll32.exe傳遞給user32.dll內的SwapMouseButton的有效窗口句柄不等於0,並且定義爲TRUE。

你可以找到RUNDLL32.EXE和細節函數使用原型該可執行這裏所說的: INFO: Windows Rundll and Rundll32 Interface

您可以找到有關功能SwapMouseButton這裏的細節: SwapMouseButton function (Windows)

0

我解決了同通過在開始菜單中搜索「鼠標」來解決問題。你會找到一個同名的選項。點擊它。將出現一個對話框。在「按鈕配置」框中取消選擇按鈕選項卡中的「切換主要和次要按鈕」選項。

1

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以防止控制檯窗口閃爍。