2016-12-14 21 views
1

公平な人がスタックオーバーフローする!今日の私の質問は、キーの押下を検出する方法ですが、バッチウィンドウ自体では検出できません。バッチ・ウィンドウ自体を選択した場合、私は、すでにバッチで別のウィンドウでキーストロークを検出する

choice /c KEY /n /t 5 /d d 
if %errorlevel%==1 goto restofcode 

これのみ作品を、このコードを持っています。私が必要とするのは、実際のバッチコマンドライン自体のの外にCtrl + W を押した場合に検出する方法(バッチまたは他の言語)です。

GSオートクリッカーと呼ばれるプログラムがあり、キーを押すとマウスがクリックされます。私はあなたが何キーを押したかを検出する限り、このようなものを求めています。

私は何度も何度も繰り返してきたことをお詫びしますが、私はあなたが私の質問を理解していることを確認しています!

-R2bEEaton

+1

は、[ウィンドウでキーを押す上のイベントをトリガ]を見てください(http://superuser.com/questions/785245/trigger-an-event-on-key-press-in-windows )。 –

+1

user32.dllから 'GetAsyncKeyState()'を使うことができました。これは、どのウィンドウがフォーカスされているかにかかわらず、キー押しを検出します。 – rojo

+0

キーボードショートカットをショートカットに追加できます。それから、 'createobject(" WScript.Shell ")を使ってscript.vbsをターゲットとして置くことができます。AppActivate" Window Title "'。バットを開始するショートカットにホットキーを置くと、すでに実行中のバットに切り替わります。 –

答えて

2

Okieどけは、ここでバッチ+ PowerShellのハイブリッドスクリプトを使用してGetAsyncKeyState()を実証する例を示します。 .bat拡張子で保存してください。インラインコメントでは、その仕組みが十分に説明されていることを願っています。その関数の期待される引数と戻り値の型に関する完全な詳細はSee the MSDN page on GetAsyncKeyState()を参照してください。

編集:修正されたバグ。ユーザがWを押して放してからCtrlを押すと、元の回答がトリガされます。私のPowerShell 2.0インタプリタはバグのような動作をしているようです。各ループ反復で戻り値をGetAsyncKeyState()に設定すると、それを修正するようです。また、System.Windows.Forms.Keys collectionを利用して鍵定義を少し軽くし、「最近押された」ビットが「現在押されている」という誤検出を引き起こす可能性を排除しました。

<# : batch portion (begins PowerShell multiline comment block) 
@echo off & setlocal 

set /P "=Waiting for ctrl-W... "<NUL 

rem # re-launch self with PowerShell interpreter 
powershell -noprofile "iex (${%~f0} | out-string)" 

echo Pressed. Toodles. 

goto :EOF 
: end batch/begin PowerShell chimera #> 

# import GetAsyncKeyState() 
Add-Type user32_dll @' 
    [DllImport("user32.dll")] 
    public static extern short GetAsyncKeyState(int vKey); 
'@ -namespace System 

# for Keys object constants 
Add-Type -As System.Windows.Forms 

function keyPressed($key) { 
    return [user32_dll]::GetAsyncKeyState([Windows.Forms.Keys]::$key) -band 32768 
} 

while ($true) { 
    $ctrl = keyPressed "ControlKey" 
    $W = keyPressed "W" 
    if ($ctrl -and $W) { break } 
    start-sleep -milliseconds 40 
} 

$Host.UI.RawUI.FlushInputBuffer() 
+0

ここで私はちょっと後で、これを使っていてうまくいきましたが、今度は "powershell"が内部コマンドまたは外部コマンドとして認識されないというエラーが表示されます。私はそれをループするように修正しようとしましたが、それは動作しましたが、今は動作しません。 – R2bEEaton

+0

@BatchManあなたの '%PATH%'環境変数を台無しにしたように聞こえます。再起動しても問題は解決しませんか? cmdコンソールに移動し、 'where powershell'と入力すると、コマンドは' powershell.exe'への完全修飾パスを返しますか?これが役に立たない場合は、修正を試みた別の質問を投稿する必要があります。 – rojo

+0

うーん、私は道をつぶしていました。私がチャンスを取ったとき、私はそれを元のように戻そうとします。ありがとう! – R2bEEaton

関連する問題