Как я могу использовать Rundll32 для замены кнопки? - PullRequest
6 голосов
/ 24 января 2011

Я повторяю вопрос с другого форума, так как я хотел бы получить тот же ответ.

Из MSDN Функция SwapMouseButton .

Как передать логические данные из командной строки через rundll32.exe в аргумент логического типа в команде, выполняющейся из user32.dll?

Я пытаюсь запустить это из CMD (командная строка)

RUNDLL32.EXE user32.dll,SwapMouseButton *

Где звездочка здесь, где аргумент должен идти. Я уже запустил его без аргумента, и он поменял местами левую и правую кнопки мыши (кажется, TRUE - запись по умолчанию для логического аргумента). Теперь я хочу отменить это. Однако я попробовал каждый из них для передачи FALSE в аргументе, и ни один из них не сработал (ни один не вернул мои кнопки мыши в нормальное состояние).

  • F
  • F
  • ложь
  • Ложная
  • FALSE
  • "ложь"
  • "False"
  • "FALSE"
  • 0
  • -1

Пожалуйста, помогите мне передать аргумент по мере необходимости. Заранее спасибо.

Ответы [ 5 ]

13 голосов
/ 09 мая 2012

Большое спасибо за решение 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
        }
    }
}
13 голосов
/ 25 января 2011

Вы не используйте для этого rundll32.

Q164787: ИНФОРМАЦИЯ: Windows Rundll и интерфейс Rundll32

[...] Программы Rundll и Rundll32 не позволяют вам вызывать любую экспортированную функцию из любой DLL.Например, вы не можете использовать эти служебные программы для вызова вызовов Win32 API (Application Programming Interface), экспортированных из системных библиотек DLL.Программы позволяют вам вызывать функции только из DLL, которая явно написана для их вызова.


Если у вас установлена ​​среда .NET Framework Runtime, она поставляется с компиляторами для нескольких языков.(например, %SystemRoot%\Microsoft.NET\Framework64\v3.5\csc.exe для компилятора C3 v3.5 в 64-битных системах).Вы можете написать программу на 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 голосов
/ 17 мая 2015

Есть хак, который можно использовать для настройки раскладки мыши для левши.Просто выполните следующую команду:

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.

Если вы вызываете SwapMouseButton, используя rundll32.exe с дополнительной командной строкой, эта командная строка будет передана этой функции как lpszCmdLine и будет игнорироваться.

Если вы вызываете эти функции, используя rundll32, rundll32 автоматически передает действительный дескриптор окна (HWND) в качестве первого аргумента вызываемой функции.

hwnd - дескриптор окна, который следует использовать в качестве окна владельца для любых окон, которые создает ваша DLL

Функция SwapMouseButtoФункция n, вызываемая rundll32, требует ИСТИНА в качестве первого аргумента, чтобы настроить расположение мыши для левши.Допустимый дескриптор окна, переданный rundll32.exe в SwapMouseButton внутри user32.dll, не равен 0 и определяется как ИСТИНА при использовании значения BOOL.

Подробные сведения о rundll32.exe и прототипе, используемомФункции, вызываемые этим исполняемым файлом здесь: ИНФОРМАЦИЯ: Windows Rundll и интерфейс Rundll32

Подробнее о функции SwapMouseButton можно найти здесь: Функция SwapMouseButton (Windows)

1 голос
/ 15 апреля 2017

Более короткий свопер в C:

#include <windows.h>

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

    return 0;  
}

Установите Windows SDK и скомпилируйте в командной строке x86_x64 Cross Tools, например, через. cl swapmbtn.c "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x64\user32.lib"

Переименуйте main в WinMain, чтобы предотвратить мигание окна консоли.

0 голосов
/ 04 октября 2016

Я решил ту же проблему с помощью поиска «мыши» в меню «Пуск».Вы найдете вариант с тем же именем.щелкните по немуПоявится диалоговое окно.Снимите флажок «переключать первичные и вторичные кнопки» на вкладке кнопок с полем «конфигурации кнопок».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...