none
PS> sendkey 2 rdp RRS feed

  • Вопрос

  • Нужно передать в окошко терминалки нажатие кнопки энтер.

    Чтото пока не выходит аленький цветочек. Может есть у кого нить готовый пример чего нить подобного?

    пока курю pInvoke и key scan codes

    15 октября 2015 г. 10:46

Все ответы

  • Я через васп делал

    https://social.technet.microsoft.com/Forums/ru-RU/41802b8e-3b43-4647-8804-f1414cf9759d/powershell-gui?forum=scrlangru


    The opinion expressed by me is not an official position of Microsoft

    15 октября 2015 г. 12:24
    Модератор
  • имхо wasp и autoit тут как из пушки по воробьям... всего то надо залогиниться в несколько терминалок, но вот злоколючий интерактив логон мессадж всю малину портит.
    15 октября 2015 г. 12:49
  • Попробуй так:

    Add-Type @"
      using System;
      using System.Runtime.InteropServices;
      public class Tricks {
         [DllImport("user32.dll")]
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool SetForegroundWindow(IntPtr hWnd);
      }
    "@
    try 
    {
        $handle = (Get-Process -Name mstsc -ea Stop | Select -First 1).MainWindowHandle
        [void][Tricks]::SetForegroundWindow($handle)
        Start-Sleep -Milliseconds 50
        Add-Type -AssemblyName System.Windows.Forms
        [System.Windows.Forms.SendKeys]::SendWait("{F5}")
    }
    catch
    {
        $Error[0].Exception.Message
    }


    16 ноября 2015 г. 15:07
  • В свое время мне помогла функия SendInput (SendKeys,SendMessage - с ними у меня не получилалось отправить спец. клавиши). Код для нажатия Enter(13) - http://stackoverflow.com/questions/5028872/sendkeys-alternative-that-works-on-citrix

    
    
    $code = @"
    public struct HARDWAREINPUT
    {
    	public UInt32 Msg;
    	public UInt16 ParamL;
    	public UInt16 ParamH;
    }
    
    public struct INPUT
    {
    	public UInt32 Type;
        public MOUSEKEYBDHARDWAREINPUT Data;
    }
    
    public struct KEYBDINPUT
    {
            public UInt16 KeyCode;
            public UInt16 Scan;
            public UInt32 Flags;
            public UInt32 Time;
            public IntPtr ExtraInfo;
    }
    
    [StructLayout(LayoutKind.Explicit)]
    public struct MOUSEKEYBDHARDWAREINPUT
    {
    		[FieldOffset(0)]
            public MOUSEINPUT Mouse;
    
            [FieldOffset(0)]
            public KEYBDINPUT Keyboard;
    
            [FieldOffset(0)]
            public HARDWAREINPUT Hardware;
    }
    
    public struct MOUSEINPUT
    {
            public Int32 X;
            public Int32 Y;
            public UInt32 MouseData;
            public UInt32 Flags;
            public UInt32 Time;
            public IntPtr ExtraInfo;
    }
    
    [DllImport("user32.dll", SetLastError = true)]
    public static extern UInt32 SendInput(UInt32 numberOfInputs, INPUT[] inputs, Int32 sizeOfInputStructure);
    [DllImport("user32.dll")]
    public static extern uint MapVirtualKey(uint uCode, uint uMapType);
    [DllImport("user32.dll")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);
    
    public static void ProcessKey(int keyCode=13)
    {
    	var down = new INPUT();
        down.Type = 1;
        down.Data.Keyboard = new KEYBDINPUT();
        down.Data.Keyboard.KeyCode = (UInt16)keyCode;
        // Scan Code here, was 0
        down.Data.Keyboard.Scan = (ushort) MapVirtualKey((UInt16)keyCode, 0);
        down.Data.Keyboard.Flags = 0;
        down.Data.Keyboard.Time = 0;
        down.Data.Keyboard.ExtraInfo = IntPtr.Zero;
    
        var up = new INPUT();
        up.Type = 1;
        up.Data.Keyboard = new KEYBDINPUT();
        up.Data.Keyboard.KeyCode = (UInt16)keyCode;
        // Scan Code here, was 0
        up.Data.Keyboard.Scan = (ushort)MapVirtualKey((UInt16)keyCode, 0);
        up.Data.Keyboard.Flags = (UInt32)2;
        up.Data.Keyboard.Time = 0;
        up.Data.Keyboard.ExtraInfo = IntPtr.Zero;
    
        INPUT[] inputList = new INPUT[2];
        inputList[0] = down;
        inputList[1] = up;
    
        var numberOfSuccessfulSimulatedInputs = SendInput(2, 
             inputList, Marshal.SizeOf(typeof(INPUT)));
    }	   
    "@
    
    Add-Type -MemberDefinition $code -Name "Native" -Namespace Win32
    $hwnd = Get-Process mstsc | Select -Expand MainWindowHandle -First 1
    if($hwnd) {
    	if([Win32.Native]::SetForegroundWindow($hwnd))
    	{
    		Start-Sleep -Seconds 1
    		[Win32.Native]::ProcessKey()
    		Start-Sleep -Seconds 1
    		[Win32.Native]::ProcessKey()
    	}
    }
    




    • Изменено KazunEditor 16 ноября 2015 г. 18:06
    16 ноября 2015 г. 18:02
    Отвечающий
  • А еще можно вот так:

    [void][System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic")
    [Microsoft.VisualBasic.Interaction]::AppActivate((ps mstsc).MainWindowTitle)
    [void][System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms")
    [System.Windows.Forms.SendKeys]::SendWait("{ENTER}")



    17 ноября 2015 г. 7:00