「GetKeyState.exe(キー状態取得実行ファイル)」の版間の差分
SyntaxHighlightにcopyの追加 |
|||
| (3人の利用者による、間の34版が非表示) | |||
| 1行目: | 1行目: | ||
= 概要 = | [https://www.haijin-boys.com/software/mery/mery-3-7-0#36 Mery Ver 3.7.2]から[[マクロリファレンス:3:Shell オブジェクト#GetKeyState メソッド|shell.GetKeyStateメソッド]]が使えるようになりました。プロセス起動のタイムラグなど、パフォーマンス面でも有利ですし、柔軟性も高いので、該当バージョンが利用できる場合は上記メソッドの利用を検討してください。 | ||
== 概要 == | |||
修飾キーの押下状態を取得する実行ファイルです。 | 修飾キーの押下状態を取得する実行ファイルです。 | ||
Shift、Ctrl、Alt | Shift、Ctrl、Alt いずれかのキーの押下状態を取得できます。マクロスクリプトからキー状態を取得し、状態に応じて動作をコントロールしたくて作成しました。 | ||
作成されたマクロから利用できますので、ご自由にお使いください。 | 作成されたマクロから利用できますので、ご自由にお使いください。 | ||
zipファイルをダウンロードしたら、ファイルのプロパティ画面で「ブロックの解除」を行ってください(これをしないと実行時に警告が表示されることがあります)。 | |||
その後、zipファイルを展開して、マクロから実行されるフォルダーに配置してください(推奨は '''"Macros"フォルダー'''とします)。 | |||
== ダウンロード == | |||
[[ファイル:GetKeyState.zip]] | [[ファイル:GetKeyState.zip]] | ||
== 変更履歴 == | |||
* 1.0.0 (2019-03-04) | |||
** 新規作成 | |||
= | == 使い方 == | ||
コマンドライン引数で、"Shift" "Ctrl" "Alt" のいずれかを渡してください。 | |||
<pre> | |||
GetKeyState.exe shift // Shiftキーの押下状態を取得する場合 | |||
</pre> | |||
* 大文字小文字は区別しません | * 大文字小文字は区別しません | ||
* 実は先頭の1文字しか判断していませんので、"s"のみとかでも大丈夫です | * 実は先頭の1文字しか判断していませんので、"s"のみとかでも大丈夫です | ||
戻り値(終了コード) | |||
* 1: キーが押されている | * 1: キーが押されている | ||
* 0: キーは押されていない | * 0: キーは押されていない | ||
* -1: | * -1: エラー(引数間違い、メッセージボックスを表示します) | ||
マクロにショートカットキーを割り当てる際は、該当する修飾キー "あり" と "なし" の両方を割り当ててください | マクロにショートカットキーを割り当てる際は、該当する修飾キー "あり" と "なし" の両方を割り当ててください | ||
* Shift+F8 / F8 など | * Shift+F8 / F8 など | ||
ツールバーにアイコン化しているマクロの場合は、"修飾キー+クリック" か "ふつうの左クリック" かでマクロの動作を切り替えることができます。 | ツールバーにアイコン化しているマクロの場合は、"修飾キー+クリック" か "ふつうの左クリック" かでマクロの動作を切り替えることができます。 | ||
ツールバーの [マクロ] メニューや右クリックメニューから実行する際は、Shift または Ctrl キーを押しながら実行することができますが、Alt キーを押しながら実行することはできません(Alt キーでメニューのポップアップ表示がキャンセルされるため)。 | ツールバーの [マクロ] メニューや右クリックメニューから実行する際は、Shift または Ctrl キーを押しながら実行することができますが、Alt キーを押しながら実行することはできません(Alt キーでメニューのポップアップ表示がキャンセルされるため)。 | ||
起動までに若干のタイムラグがありますので、すばやく操作すると取りこぼすことがあります。そういう意味では、ショートカットキーにはあまり向かないかもしれません。私は、ツールバー起動で使っています。 | |||
: ※マクロの処理が開始するか終了するまで修飾キーを押しつづければ、取りこぼしはなくなります。また、マクロの処理が全体的に重い/長いソースコードの場合は、[[#実装例|実装例]] にあるような修飾キー取得コードの部分をソースコードの先頭に配置するとよいでしょう。 | |||
== 実装例 == | |||
サンプルコードの | |||
<syntaxhighlight lang="javascript"> | |||
window.Alert( "XXキーが押されています" ); | |||
</syntaxhighlight> | |||
の部分を任意の動作コードに置きかえてください。マクロの動作内容に変化をつけたり、複数のマクロの実行コードを振り分けてひとつのマクロにまとめたりすることができます。 | |||
;サンプルコード1 | |||
; | <syntaxhighlight lang="javascript" copy> | ||
< | |||
var wshShell = new ActiveXObject("WScript.Shell"); | var wshShell = new ActiveXObject("WScript.Shell"); | ||
| 73行目: | 67行目: | ||
if(shift == 1) window.Alert("Shiftキーが押されています"); | if(shift == 1) window.Alert("Shiftキーが押されています"); | ||
} | } | ||
</ | </syntaxhighlight> | ||
;サンプルコード2 | |||
* 実行ファイル GetKeyState.exe の実在確認をします(GetKeyState がない場合でも動作する) | |||
* カレントディレクトリ(Mery.exe の作業フォルダ)を変更しません | |||
<syntaxhighlight lang="javascript" copy> | |||
var ctrl = 0, alt = 0; | |||
// GetKeyState.exe のフルパスを " " で囲う | |||
var gks = '"' + editor.FullName.replace( /[^\\]+$/ , '' ) | |||
var | + 'Macros\\GetKeyState.exe"'; | ||
// GetKeyState. | // 半角空白+コマンドライン引数をつけて GetKeyState を実行する(実行ファイルの実在確認をする) | ||
var | if ( new ActiveXObject( "Scripting.FileSystemObject" ).FileExists( gks ) ) { | ||
var wshShell = new ActiveXObject('WScript.Shell'); | |||
// Ctrl キーの状態を取得 | |||
ctrl = wshShell.Run( gks + ' control', 0, true ); | |||
// Ctrl キーの状態を取得 | // Alt キーの状態を取得 | ||
alt = WshShell.Run( gks + ' alt' , 0, true ); | |||
// Alt キーの状態を取得 | } | ||
// 修飾キーによる動作の切り替え | // 修飾キーによる動作の切り替え | ||
| 101行目: | 100行目: | ||
} | } | ||
else { | else { | ||
window.Alert( "修飾キーは押されていません" ); | window.Alert( "修飾キーは押されていません" ); // ← GetKeyState.exe がない場合も | ||
} | |||
</syntaxhighlight> | |||
;サンプルコード3 | |||
ポップアップメニューマクロへの導入サンプル | |||
*メニューに表示する内容や、選択した項目から実行するコマンドを切り替えます | |||
<syntaxhighlight lang="javascript" copy> | |||
var gks = editor.FullName.replace( /[^\\]+$/i , "" ) | |||
+ "Macros\\GetKeyState.exe"; | |||
var WshShell = new ActiveXObject( "WScript.Shell" ); | |||
// マクロ開始時の Ctrl キーの状態を取得 | |||
var $ctrl1 = WshShell.Run( "\"" + gks + "\" ctrl", 0, true ); | |||
var menu = CreatePopupMenu(); | |||
menu.Add( "ほげ", 1 ); | |||
// Ctrl キーを押しながら実行したときは、項目を追加表示する | |||
if ( $ctrl1 == 1 ) { | |||
menu.Add( "ほげほげ", 2 ); | |||
} | } | ||
= | // ポップアップメニューを表示 | ||
var r = menu.Track( mePosMouse ); | |||
// Ctrl キーを押しながら項目を選択したときは、動作をを変更する | |||
var $ctrl2 = WshShell.Run( "\"" + gks + "\" ctrl", 0, true ); | |||
switch( r ) { | |||
case 1: | |||
if ( $ctrl2 === 0 ) window.Alert( "ほげ" ); | |||
else if ( $ctrl2 === 1 ) window.Alert( "ふが" ); | |||
break; | |||
case 2: | |||
if ( $ctrl2 === 0 ) window.Alert( "ほげほげ" ); | |||
else if ( $ctrl2 === 1 ) window.Alert( "ふがふが" ); | |||
break; | |||
default: | |||
break; | |||
} | |||
</syntaxhighlight> | |||
ソースも置いときます(VS2005 C++) | == その他 == | ||
ソースも置いときます(VS2005 C++)(こちらは通常ダウンロードの必要はありません) | |||
[[ファイル:GetKeyStateSrc.zip]] | [[ファイル:GetKeyStateSrc.zip]] | ||
※ | ※ 著作権は放棄します。悪意のない公序良俗の範囲内でしたら、ソースを含めご自由にお使いください(そのかわり、一切の責任も放棄します...まぁ、こんなもので誤動作もあったもんじゃないですが、派生版まで責任が持てないので)。 | ||
スポンサーリンク