Powershell использует windows API для перетаскивания мышью - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть код, который должен выполнять перетаскивание с PowerShell, но я не понимаю, почему он работает не так, как я надеюсь, чтобы он работал. Подробности ниже:

function Mouse-signature-import(){
    $global:signature=@' 
      [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
      public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@ 

    $global:SendMouseClick = Add-Type -memberDefinition $global:signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru 
}

function Mouse-Drag($from1,$from2,$to1,$to2){
    Mouse-signature-import
    [System.Windows.Forms.Cursor]::Position = "$from1,$from2"
    $global:SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
    $global:SendMouseClick::mouse_event(0x80000000, 0, 0, 0, 0); Dont know if I need this because drag is not working in all apps
    [System.Windows.Forms.Cursor]::Position = "$to1,$to2"
    $global:SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
    write-host -f yellow -b black "Mouse-Drag" -nonewline; write-host -f Gray " from " -NoNewline; write-host -f Magenta "[" -nonewline; write-host -f Red "$from1 $from2" -nonewline;write-host -f Magenta "]" -nonewline; write-host -f Gray " to " -NoNewline; write-host -f Magenta "[" -nonewline; write-host -f Red "$to1 $to2" -nonewline; write-host -f Magenta "]";
}

Я вижу движение мыши и происходит перетаскивание, однако я использую это для выделения текста. При наведении мыши текст больше не выделяется. Мне нужно настроить этот код, чтобы при отводе мышью не выделять текст, который я выделил при перетаскивании. В идеале я буду использовать sendkeys после этой функции, чтобы сделать «^ c» для копирования большую часть времени, когда я использую эту функцию.

Я добавил эту строку, думая, что это поможет.

$global:SendMouseClick::mouse_event(0x80000000, 0, 0, 0, 0);

===================== РЕШЕНИЕ:

Это было время, как предложил ДК. Я просто добавил режим сна перед событием mouse-up.

function Mouse-Drag ($ from1, $ from2, $ to1, $ to2) {$ global: silentMouseFunctions = $ true Mouse-signature-import

[System.Windows.Forms.Cursor]::Position = "$from1,$from2"
$global:SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
[System.Windows.Forms.Cursor]::Position = "$to1,$to2"
start-sleep -s 1 # If we do not sleep, then the drag does not work right.
$global:SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);

$global:silentMouseFunctions = $false
write-host -f yellow -b black "Mouse-Drag" -nonewline; write-host -f Gray " from " -NoNewline; write-host -f Magenta "[" -nonewline; write-host -f Red "$from1 $from2" -nonewline;write-host -f Magenta "]" -nonewline; write-host -f Gray " to " -NoNewline; write-host -f Magenta "[" -nonewline; write-host -f Red "$to1 $to2" -nonewline; write-host -f Magenta "]";

1 Ответ

1 голос
/ 17 февраля 2020

Потратив некоторое время на отладку кода, кажется, что нам нужно медленно перемещать курсор, чтобы перетаскивание работало правильно.

Ниже код проверен несколько раз для перемещения значка на на рабочем столе, он отлично работал на моем P C:

Add-Type @"
    using System;
    using System.Runtime.InteropServices;

    public static class Win32 
    {
        [DllImport("user32.dll")]
        static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, int dwExtraInfo);

        [DllImport("user32.dll")]
        public static extern bool SetCursorPos(int x, int y);
    }
"@;

[Win32]::SetCursorPos(25, 25);

[Win32]::mouse_event(0x0002, 0, 0, 0, 0);

for ($i = 0; $i -lt 1000; $i+=100)
{
    [Win32]::SetCursorPos($i, $i);
    Start-Sleep -m 25
}

[Win32]::mouse_event(0x0004, 0, 0, 0, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...