Помогите создать event listener на Powershell+.NET

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Nufai, 28 Mar 2018.

  1. Nufai

    Nufai Member

    Joined:
    5 Nov 2017
    Messages:
    56
    Likes Received:
    9
    Reputations:
    0
    Нужно на Powershell получить событие открытия окна Run(которое win+R). Подскажите как можно такое сделать
     
  2. Nufai

    Nufai Member

    Joined:
    5 Nov 2017
    Messages:
    56
    Likes Received:
    9
    Reputations:
    0
    Ну ладно, черт с ним, с ивентом. Как можно получить hwnd такого окна, если оно открыто?
     
  3. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    PHP:
    $pinvokes = @'
    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    public static extern IntPtr Connect(string className, string Notepad);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    '
    @

    Add-Type -AssemblyName System.Windows.Forms
    # Using Passthru for example to show you how to return type directly   
    $t Add-Type -MemberDefinition $pinvokes -Name NativeMethods -Namespace MyUtils -PassThru
    $hwnd 
    $t::FindWindow("#32770""Выполнить")
     
    Nufai likes this.
  4. Nufai

    Nufai Member

    Joined:
    5 Nov 2017
    Messages:
    56
    Likes Received:
    9
    Reputations:
    0
    Спасибо, если добавить public к FindWindow, то работает. А можно ли сделать без привязки к тайтлу? Ибо если язик системы не русский, то все сломается. Если передать null вместо названия, то ищет по классу, но #32770 - стандартный класс модальных окон
     
  5. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    PHP:
        [DllImport("user32.dll")]
        [return: 
    MarshalAs(UnmanagedType.Bool)]
        public static 
    extern bool GetWindowRect(IntPtr hWndout RECT lpRect);
    ...
    public 
    struct RECT
      
    {
        public 
    int Left;        // x position of upper-left corner
        
    public int Top;         // y position of upper-left corner
        
    public int Right;       // x position of lower-right corner
        
    public int Bottom;      // y position of lower-right corner
      
    }
    Ищешь окно по классу #32770
    Получаешь размер через GetWindowRect и сравниваешь по размеру. Мне в голову только такой вариант приходит