Mahpooya
Mahpooya

Reputation: 559

power shell : how to send middle mouse click?

How can i send middle mouse click with power shell scripts? I want something like this:

Add-Type -AssemblyName System.Windows.Forms
[Windows.Forms.SendKeys]::SendWait('{MButton}')

Upvotes: 4

Views: 21631

Answers (2)

John Bartels
John Bartels

Reputation: 2763

function Click-MouseButton
{
param(
[string]$Button, 
[switch]$help)
$HelpInfo = @'

Function : Click-MouseButton
By       : John Bartels
Date     : 12/16/2012 
Purpose  : Clicks the Specified Mouse Button
Usage    : Click-MouseButton [-Help][-Button x]
           where      
                  -Help         displays this help
                  -Button       specify the Button You Wish to Click {left, middle, right}

'@ 

if ($help -or (!$Button))
{
    write-host $HelpInfo
    return
}
else
{
    $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);
'@ 

    $SendMouseClick = Add-Type -memberDefinition $signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru 
    if($Button -eq "left")
    {
        $SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
        $SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
    }
    if($Button -eq "right")
    {
        $SendMouseClick::mouse_event(0x00000008, 0, 0, 0, 0);
        $SendMouseClick::mouse_event(0x00000010, 0, 0, 0, 0);
    }
    if($Button -eq "middle")
    {
        $SendMouseClick::mouse_event(0x00000020, 0, 0, 0, 0);
        $SendMouseClick::mouse_event(0x00000040, 0, 0, 0, 0);
    }

}


}

You can add this function to your profile, or other script, and then you can call it with:

Click-MouseButton "middle"

Upvotes: 10

Keith Hill
Keith Hill

Reputation: 201622

Well, SendKeys is for simulating keyboard input and not mouse input. If there is a keyboard mechanism to invoke the function then you can use SendKeys. For instance, you can send Alt+«char» if there is a keyboard accelerator configured for a control. Of you can send tab keys then a space key to click a button.

As for actually sending keys with PowerShell, first you have to get a handle to the Window that you want to send keystrokes to. How you get that window handle depends on how the window is created. One way is to use the Win32 API FindWindow. Once you have the Window, you need to make sure it is the foreground window (another Win32 API - SetForegroundWindow does that), then you can start sending it keystrokes. PowerShell V2 and higher allow you to access Win32 APIs via the .NET PInvoke mechanism via the Add-Type cmdlet e.g.:

Start-Process calc.exe

$pinvokes = @'
  [DllImport("user32.dll", CharSet=CharSet.Auto)]
  public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

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

Add-Type -AssemblyName System.Windows.Forms
Add-Type -MemberDefinition $pinvokes -Name NativeMethods -Namespace MyUtils

$hwnd = [MyUtils.NativeMethods]::FindWindow("CalcFrame", "Calculator")
if ($hwnd)
{
    [MyUtils.NativeMethods]::SetForegroundWindow($hwnd)
    [System.Windows.Forms.SendKeys]::SendWait("6")
    [System.Windows.Forms.SendKeys]::SendWait("*")
    [System.Windows.Forms.SendKeys]::SendWait("7")
    [System.Windows.Forms.SendKeys]::SendWait("=")
}

Another possible way, iff the Window is WinForms (or WPF) based and it is running in your PowerShell process, is to use Reflection to reach into the control you want to send a MButtonClick and invoke OnMouseClick yourself. You need a reference to the control but presumably if it is running in your PowerShell process, you created the control and therefore you have a reference to it.

You might find this MSDN article on UI Automation with Windows PowerShell useful. There is also a MSDN topic on simulating mouse and keyboard input that might be helpful.

Upvotes: 3

Related Questions