2011-01-24 9 views
5

Estoy repitiendo una pregunta de otro foro, ya que me gustaría la misma respuesta.¿Cómo uso Rundll32 para cambiar el botón?

De MSDN SwapMouseButton Function.

¿Cómo paso datos booleanos desde el símbolo del sistema a través de rundll32.exe a un argumento de tipo booleano en un comando que se ejecuta desde user32.dll?

estoy tratando de ejecutar esto desde CMD (el símbolo del sistema)

RUNDLL32.EXE user32.dll,SwapMouseButton * 

Cuando el asterisco es aquí es donde el argumento debe ir. Ya lo ejecuté sin un argumento e intercambió los botones izquierdo y derecho del mouse (parece que TRUE es la entrada predeterminada para el argumento booleano). Ahora quiero deshacerlo. Sin embargo, he probado cada uno de estos para pasar FALSO en el argumento, y ninguno ha funcionado (ninguno configuró los botones de mi mouse nuevamente a la normalidad).

  • F
  • f
  • falsa
  • False
  • FALSO
  • "falso"
  • "False"
  • "FALSE"
  • -1

Ayúdenme a pasar el argumento según sea necesario. Gracias por adelantado.

+0

No estoy en una máquina con Windows en este momento, pero ¿has probado '1' en absoluto, o nada en absoluto? –

+0

No hubo suerte con eso. – TJR

+2

rundll32 siempre pasa el argumento como una cadena, por lo tanto, en su caso, un puntero de cadena! = FALSO = VERDADERO para SwapMouseButtons. rundll32 no puede simplemente saber mágicamente analizar su argumento como un entero. – wj32

Respuesta

9

Usted do not usa rundll32 para eso.

Q164787: INFO: Windows Rundll e interfaz Rundll32

[...] programas Rundll y Rundll32 no le permiten llamar a cualquier función exportada desde cualquier DLL. Por ejemplo, no puede usar estos programas de utilidad para llamar a la API Win32 (Interfaz de programación de aplicaciones) exportada desde los archivos DLL del sistema. Los programas solo le permiten llamar a funciones de un archivo DLL escritas explícitamente para que las invoquen.


Si tiene instalado el .NET Framework Runtime, que viene con compiladores para varios idiomas (por ejemplo, %SystemRoot%\Microsoft.NET\Framework64\v3.5\csc.exe para la v3.5 compilador de C# en sistemas de 64 bits). Puede 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); 
    } 
} 

compilar con:

"%SystemRoot%\Microsoft.NET\Framework64\v3.5\csc" swap.cs 

Intercambiar botones/unswap:

swap 
swap /u 
10

Gracias tanto por la solución C#.Funcionó a las mil maravillas.

Hice una pequeña modificación para poder simplemente hacer clic en un atajo de escritorio para alternar el botón principal del mouse, sin pasar argumentos. En caso de que mi enfoque ayuda a otra persona, aquí es que la versión:

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

Hay corte, que se puede utilizar para configurar el diseño del ratón para un usuario zurdo. Sólo tiene que ejecutar el siguiente comando:

rundll32.exe user32.dll,SwapMouseButton 

Ejecutar este comando para volver a configurar el diseño del ratón para un usuario zurdo.

Voy a darle una explicación para este tipo de comportamiento:

funciones, que son llamados por rundll32.exe, tienen la función siguiente prototipo:

void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); 

SwapMouseButton tiene la siguiente función prototipo:

BOOL WINAPI SwapMouseButton(
    _In_ BOOL fSwap 
) 

SwapMouseButton utiliza la misma convención de llamada (__stdcall) ya que cada función llamada por rundll32.exe hace.

Si llama SwapMouseButton utilizando rundll32.exe con una línea de comandos adicional, esta línea de comandos se pasa a esta función como lpszCmdLine y se ignorará.

Si llama a esas funciones usando rundll32, rundll32 pasa automáticamente un identificador de ventana válido (HWND) como el primer argumento de la función llamada.

hWnd - identificador de ventana que se debe utilizar como la ventana de propietario para cualquier ventana de su DLL crea

La función función SwapMouseButton llamado por rundll32 requiere TRUE como primer argumento con el fin de configurar el diseño del ratón para un usuario zurdo. El identificador de ventana válido pasado por rundll32.exe a SwapMouseButton dentro de user32.dll no es igual a 0 y se define como VERDADERO, cuando se usa un valor BOOL.

Puede encontrar más detalles sobre rundll32.exe y el prototipo utilizado por las funciones llamadas por este ejecutable aquí: INFO: Windows Rundll and Rundll32 Interface

Puede encontrar más detalles acerca de la función SwapMouseButton aquí: SwapMouseButton function (Windows)

0

I resuelto el mismo problema al buscar "mouse" en el menú de inicio. Encontrarás una opción con el mismo nombre. Pinchalo. Un cuadro de diálogo aparecerá. Desenganche la opción "cambiar botones primario y secundario" en la pestaña de botones con el cuadro "configuraciones de botones".

1

Un Swapper más corto en C:

#include <windows.h> 

int main() 
{ 
    if (SwapMouseButton(TRUE)) 
     SwapMouseButton(FALSE); 

    return 0; 
} 

instalar Windows SDK y compilar en x86_x64 Cruz comandos de las herramientas a través de por ejemplo. cl swapmbtn.c "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x64\user32.lib"

Renombre main a WinMain para evitar que la ventana de la consola destelle.

Cuestiones relacionadas