2013-05-08 18 views
2

Мне нужно запустить следующие две строки кода, чтобы открыть базу данных доступа. Проблема заключается в том, что эта база данных имеет автоматически загруженную форму модели, которая блокирует остальную часть сценария powershell, пока она не будет закрыта.В powershell, как можно имитировать нажатие клавиши shift?

$ms_access = New-Object -ComObject "Access.Application" 
$ms_access.OpenCurrentDatabase("C:\db.accdb", $false) 

Я могу избежать диалога при открытии базы данных, если нажата клавиша смены. Я тестировал это, и он работает. Теперь мне не нужно будет удерживать клавишу shift во время запуска моего сценария powershell, так что есть способ в PowerShell, чтобы имитировать нажатие клавиши shift? Не только SendKey, но и нажмите и удерживайте в течение OpenCurrentDatabase?

Что-то вроде?

$ms_access = New-Object -ComObject "Access.Application" 
Set-Shift-Down 
$ms_access.OpenCurrentDatabase("C:\db.accdb", $false) 
Set-Shift-Up 

Это для Powershell-v2

ответ

3

I'ld использовать p/invoke:

Add-Type @" 
using System;                  
using System.Runtime.InteropServices; 
public class Tricks { 
[DllImport("user32.dll")]                
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);} 
"@ 

[system.reflection.assembly]::Loadwithpartialname("system.windows.forms") 

#left shift key pressed 
[tricks]::keybd_event([System.Windows.Forms.Keys]::LShiftKey, 0x45, 0, 0); 
... do stuff here 
#left shift key released 
[tricks]::keybd_event([System.Windows.Forms.Keys]::LShiftKey, 0x45, 0x2, 0);  

, если вы не хотите нагрузки windows.forms сборки используют 0xA0 в качестве значения для LShiftKey

I действительно не знаю, родной путь powershell, p/invoke должен работать, но я не могу проверить его, как вы хотите его использовать.