teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

psコード追加

2021/02/23 03:56

投稿

ku__ra__ge
ku__ra__ge

スコア4524

answer CHANGED
@@ -1,3 +1,37 @@
1
1
  ウインドウのスナップ機能はwindowsキー+矢印でも実行できます。このキーを押す操作をスクリプトから行えばいいと思います。
2
2
  一般的にキー操作を送るにはsendwaitを使うのが簡単ですが、sendwaitではWindowsキーを押しながら何かのキーを押すという動作は行えないため今回の問題を解決するには使えません。
3
- おそらくc#でwindows apiを使ってキー送信を行うコードを書いて、それをpowershellから実行させるという方法で実現できると思います。
3
+ おそらくc#でwindows apiを使ってキー送信を行うコードを書いて、それをpowershellから実行させるという方法で実現できると思います。
4
+
5
+ 例えば、以下コードでWin+左矢印キーを送信できます。
6
+
7
+ ```powershell
8
+ # powershellで特殊なキー送信ー
9
+
10
+ # C#のキー送信クラス
11
+ Add-Type -Language CSharp -ReferencedAssemblies System.Windows.Forms,System.Drawing -TypeDefinition @'
12
+ public class SendKeysEx
13
+ {
14
+ private const byte VK_LWIN = 0x5B; // Win Key
15
+ private const byte VK_LEFT = 0x25; // Left Arrow
16
+
17
+ [System.Runtime.InteropServices.DllImport("user32.dll")]
18
+ private static extern uint keybd_event(byte bVk, byte bScan, uint dwFlags, System.IntPtr dwExtraInfo);
19
+
20
+ public static void Send()
21
+ {
22
+ // 仮想キーコード
23
+ // http://kts.sakaiweb.com/virtualkeycodes.html
24
+ // https://docs.microsoft.com/ja-jp/windows/win32/inputdev/virtual-key-codes?redirectedfrom=MSDN
25
+ keybd_event(VK_LWIN, 0, 0, (System.IntPtr)0);
26
+ keybd_event(VK_LEFT, 0, 0, (System.IntPtr)0);
27
+ System.Threading.Thread.Sleep(50);
28
+ keybd_event(VK_LEFT, 0, 2/*KEYEVENTF_KEYUP*/, (System.IntPtr)0);
29
+ keybd_event(VK_LWIN, 0, 2/*KEYEVENTF_KEYUP*/, (System.IntPtr)0);
30
+ }
31
+ }
32
+ '@
33
+
34
+ # キー送信
35
+ sleep 3 # 3秒後に送信
36
+ [SendKeysEx]::Send()
37
+ ```