Toggle Повышение точности указателя

Мы в основном создаем апплет панели управления. Нам нужно переключить «Увеличить точность указателя» в свойствах мыши.
Для этого нам нужно вызвать SystemParametersInfo с помощью SPI_GETMOUSE. Он имеет массив из 3 элементов в качестве третьего параметра. Я новичок в PInvoke, и я пробовал много подписей, но пока безуспешно. Вот что я пробовал для подписи:

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SystemParametersInfo(uint uiAction, uint uiParam, [MarshalAs(UnmanagedType.LPArray)] ref long[] vparam, SPIF fWinIni);  

static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref long[] vparam, SPIF fWinIni);

Ничто из вышеперечисленного не сработало для меня, и вот исключение, которое я получаю:
System.AccessViolationException: Попытка чтения или записи защищенной памяти. Часто это указывает на то, что другая память повреждена.
Во время поиска я нашел ссылку это, которое находится в VB.

Решение: благодаря ответу GWLlosa и этот Я придумал решение:

[DllImport("user32.dll", EntryPoint = "SystemParametersInfo", SetLastError = true)]
public static extern bool SystemParametersInfoGet(uint action, uint param, IntPtr vparam, SPIF fWinIni);
public const UInt32 SPI_GETMOUSE = 0x0003;
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo", SetLastError = true)]
public static extern bool SystemParametersInfoSet(uint action, uint param, IntPtr vparam, SPIF fWinIni);
public const UInt32 SPI_SETMOUSE = 0x0004;
public static bool ToggleEnhancePointerPrecision(bool b)
{
    int[] mouseParams = new int[3];
    // Get the current values.
    SystemParametersInfoGet(SPI_GETMOUSE, 0, GCHandle.Alloc(mouseParams, GCHandleType.Pinned).AddrOfPinnedObject(), 0);
    // Modify the acceleration value as directed.
    mouseParams[2] = b ? 1 : 0;
    // Update the system setting.
    return SystemParametersInfoSet(SPI_SETMOUSE, 0, GCHandle.Alloc(mouseParams, GCHandleType.Pinned).AddrOfPinnedObject(), SPIF.SPIF_SENDCHANGE);
}

Также оказалась полезной эта документация.


person SepehrM    schedule 14.07.2014    source источник
comment
Я думаю, вы должны сделать это int[] вместо ref long[].   -  person Henrik    schedule 14.07.2014


Ответы (1)


Ты пытался:

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SystemParametersInfo(SPI uiAction, uint uiParam, IntPtr pvParam, SPIF fWinIni);

Бессовестно снято с:

http://www.pinvoke.net/default.aspx/user32/SystemParametersInfo.html

person GWLlosa    schedule 14.07.2014
comment
Ты прав. Кажется, я пропустил это (я не хотел сам получать адрес памяти!) - person SepehrM; 14.07.2014