none
powershell focus window scrolling RRS feed

  • Вопрос

  • Подскажите комманды для powershell
    Чтобы проскролить окно на заданную позицию?
    Вот таким образом я нужное окно делаю в фокусе.
    И навожу мышку на ту область которую нужно скролить.
    Но как правильно скролить никак не получается нагуглить.
    param([string] $proc="Viber", [string]$adm)
    Add-Type @"
      using System;
      using System.Runtime.InteropServices;
      public class WinAp {
         [DllImport("user32.dll")]
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool SetForegroundWindow(IntPtr hWnd);
    
         [DllImport("user32.dll")]
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
      }
    
    "@
    $p = Get-Process |where {$_.mainWindowTItle }|where {$_.Name -like "$proc"}
    $h = $p.MainWindowHandle
    [void] [WinAp]::SetForegroundWindow($h)
    #[void] [WinAp]::ShowWindow($h,3);
    
    Add-Type -AssemblyName System.Windows.Forms
    
    $Pos = [System.Windows.Forms.Cursor]::Position
    $x = 1800
    $y = 200
    [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y)

    18 марта 2019 г. 9:41

Ответы

  • подсмотрел тут:

    https://social.technet.microsoft.com/Forums/scriptcenter/en-US/313426f7-71c4-4e95-9690-e3628d17d6c0/powershell-and-webpage-scrolling?forum=ITCG

    в моем случае телега и координаты другие (кстати почему абсолютные?)

    param([string] $proc="Telegram", [string]$adm)
    Add-Type @"
      using System;
      using System.Runtime.InteropServices;
      public class WinAp {
         [DllImport("user32.dll")]
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool SetForegroundWindow(IntPtr hWnd);
    
         [DllImport("user32.dll")]
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    
         [DllImport("user32.dll")]
         static extern void mouse_event(MouseEventFlags dwFlags, int dx, int dy, int dwData, UIntPtr dwExtraInfo);
            
            [Flags]
            public enum MouseEventFlags
            {
                LEFTDOWN = 0x00000002,
                LEFTUP = 0x00000004,
                MIDDLEDOWN = 0x00000020,
                MIDDLEUP = 0x00000040,
                MOVE = 0x00000001,
                ABSOLUTE = 0x00008000,
                RIGHTDOWN = 0x00000008,
                RIGHTUP = 0x00000010,
                WHEEL = 0x0800
            }
    
            public static void MoveWheelUp()
            {
                    mouse_event(MouseEventFlags.WHEEL, 0, 0, 500, UIntPtr.Zero);
            }
            public static void MoveWheelDown()
            {
                    mouse_event(MouseEventFlags.WHEEL, 0, 0, -500, UIntPtr.Zero);
            }
    
      }
    
    "@
    $p = Get-Process |where {$_.mainWindowTItle }|where {$_.Name -like "$proc"}
    $h = $p.MainWindowHandle
    [void] [WinAp]::SetForegroundWindow($h)
    #[void] [WinAp]::ShowWindow($h,3);
    
    Add-Type -AssemblyName System.Windows.Forms
    
    $Pos = [System.Windows.Forms.Cursor]::Position
    $x = 400
    $y = 200
    [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y)
    
    [WinAp]::MoveWheelDown()
    [WinAp]::MoveWheelDown()
    start-sleep -sec 5
    [WinAp]::MoveWheelUP()
    [WinAp]::MoveWheelUP()
    
    
    

    • Помечено в качестве ответа korggrodno3 18 марта 2019 г. 12:08
    18 марта 2019 г. 11:05

Все ответы

  • подсмотрел тут:

    https://social.technet.microsoft.com/Forums/scriptcenter/en-US/313426f7-71c4-4e95-9690-e3628d17d6c0/powershell-and-webpage-scrolling?forum=ITCG

    в моем случае телега и координаты другие (кстати почему абсолютные?)

    param([string] $proc="Telegram", [string]$adm)
    Add-Type @"
      using System;
      using System.Runtime.InteropServices;
      public class WinAp {
         [DllImport("user32.dll")]
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool SetForegroundWindow(IntPtr hWnd);
    
         [DllImport("user32.dll")]
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    
         [DllImport("user32.dll")]
         static extern void mouse_event(MouseEventFlags dwFlags, int dx, int dy, int dwData, UIntPtr dwExtraInfo);
            
            [Flags]
            public enum MouseEventFlags
            {
                LEFTDOWN = 0x00000002,
                LEFTUP = 0x00000004,
                MIDDLEDOWN = 0x00000020,
                MIDDLEUP = 0x00000040,
                MOVE = 0x00000001,
                ABSOLUTE = 0x00008000,
                RIGHTDOWN = 0x00000008,
                RIGHTUP = 0x00000010,
                WHEEL = 0x0800
            }
    
            public static void MoveWheelUp()
            {
                    mouse_event(MouseEventFlags.WHEEL, 0, 0, 500, UIntPtr.Zero);
            }
            public static void MoveWheelDown()
            {
                    mouse_event(MouseEventFlags.WHEEL, 0, 0, -500, UIntPtr.Zero);
            }
    
      }
    
    "@
    $p = Get-Process |where {$_.mainWindowTItle }|where {$_.Name -like "$proc"}
    $h = $p.MainWindowHandle
    [void] [WinAp]::SetForegroundWindow($h)
    #[void] [WinAp]::ShowWindow($h,3);
    
    Add-Type -AssemblyName System.Windows.Forms
    
    $Pos = [System.Windows.Forms.Cursor]::Position
    $x = 400
    $y = 200
    [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y)
    
    [WinAp]::MoveWheelDown()
    [WinAp]::MoveWheelDown()
    start-sleep -sec 5
    [WinAp]::MoveWheelUP()
    [WinAp]::MoveWheelUP()
    
    
    

    • Помечено в качестве ответа korggrodno3 18 марта 2019 г. 12:08
    18 марта 2019 г. 11:05
  • Спасибо огромное за ваш пример скрипта.
    Он мне очень помог.
    Единственное, чего не получается добиться -
    Это стабильной прокрутки окна на заданную величину.
    Вот так выглядит мой конечный скрипт.
    Но окно каждый раз прокручивается на разное количество.
    И как сделать, чтобы каждый раз одинаково прокручивалось не получается сообразить.

    param([string] $proc="Viber", [string]$adm)
    Add-Type @"
      using System;
      using System.Runtime.InteropServices;
      public class WinAp {
         [DllImport("user32.dll")]
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool SetForegroundWindow(IntPtr hWnd);
    
         [DllImport("user32.dll")]
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    
         [DllImport("user32.dll")]
         static extern void mouse_event(MouseEventFlags dwFlags, int dx, int dy, int dwData, UIntPtr dwExtraInfo);
            
            [Flags]
            public enum MouseEventFlags
            {
                LEFTDOWN = 0x00000002,
                LEFTUP = 0x00000004,
                MIDDLEDOWN = 0x00000020,
                MIDDLEUP = 0x00000040,
                MOVE = 0x00000001,
                ABSOLUTE = 0x00008000,
                RIGHTDOWN = 0x00000008,
                RIGHTUP = 0x00000010,
                WHEEL = 0x0800
            }
    
            public static void MoveWheelUp()
            {
                    mouse_event(MouseEventFlags.WHEEL, 0, 0, 500, UIntPtr.Zero);
            }
            public static void MoveWheelDown()
            {
                    mouse_event(MouseEventFlags.WHEEL, 0, 0, -500, UIntPtr.Zero);
            }
    
      }
    
    "@
    #.\to_clipboard.ps1
    $p = Get-Process |where {$_.mainWindowTItle }|where {$_.Name -like "$proc"}
    $h = $p.MainWindowHandle
    [void] [WinAp]::SetForegroundWindow($h)
    #[void] [WinAp]::ShowWindow($h,3);
    
    Add-Type -AssemblyName System.Windows.Forms
    
    $Pos = [System.Windows.Forms.Cursor]::Position
    $x = 1800
    $y = 200
    [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y)
    
    1..70 | % { 
    [WinAp]::MoveWheelDown() 
    [WinAp]::MoveWheelDown()
    start-sleep -Milliseconds 20
    }
    #[WinAp]::MoveWheelDown()
    

    21 марта 2019 г. 5:58
  • param([string] $proc="Telegram", [string]$adm)
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type @"
      using System;
      using System.Runtime.InteropServices;
      public class WinAp {
         [DllImport("user32.dll")]
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool SetForegroundWindow(IntPtr hWnd);
    
         [DllImport("user32.dll")]
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    
         [DllImport("user32.dll")]
         static extern void mouse_event(MouseEventFlags dwFlags, int dx, int dy, int dwData, UIntPtr dwExtraInfo);
            
            [Flags]
            public enum MouseEventFlags
            {
                LEFTDOWN = 0x00000002,
                LEFTUP = 0x00000004,
                MIDDLEDOWN = 0x00000020,
                MIDDLEUP = 0x00000040,
                MOVE = 0x00000001,
                ABSOLUTE = 0x00008000,
                RIGHTDOWN = 0x00000008,
                RIGHTUP = 0x00000010,
                WHEEL = 0x0800
            }
    
            public static void MoveWheelUp()
            {
                    mouse_event(MouseEventFlags.WHEEL, 0, 0, 1, UIntPtr.Zero);
            }
            public static void MoveWheelDown()
            {
                    mouse_event(MouseEventFlags.WHEEL, 0, 0, -1, UIntPtr.Zero);
            }
    
      }
    
    "@
    
    
    
    $p = Get-Process |where {$_.mainWindowTItle }|where {$_.Name -like "$proc"}
    $h = $p.MainWindowHandle
    [void] [WinAp]::SetForegroundWindow($h)
    #[void] [WinAp]::ShowWindow($h,3);
    
    $Pos = [System.Windows.Forms.Cursor]::Position
    $x = 400
    $y = 200
    [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y)
    echo "mouse wheel down"
    1..1000|%{[WinAp]::MoveWheelDown();start-sleep -Milliseconds 1}
    start-sleep -sec 1
    echo "mouse wheel up"
    1..1000|%{[WinAp]::MoveWheelUp();start-sleep -Milliseconds 1}
    
    



    21 марта 2019 г. 7:36