ビルドパッケージ(ソース+バイナリ) : send_ctrlkey.exe ブラウザでダウンロード 汎用型デスクトップ活用支援Windows のデスクトップでは、デスクトップのショートカットの ショートカットキーが有効なので、エディタ系のアプリを実行中に CTRL+C の打鍵と外部プログラムの実行を同時にアクションさせます。 send_ctrlkey.exe のショートカットをデスクトップに作成して、 ショートカットキーを登録し、以下のようにコマンドラインを指定します "パス\send_ctrlkey.exe" 1000 0x43 10 引数を含めた外部アプリケーションのコマンドライン ( 区切りのスペースは1つにして下さい ) ※ キーを送るまでの待機時間(ミリ秒)は自由に指定します ※ (エディタ上でキー操作がなくなるまでの時間) ※ よって、多少、キーボード操作に注意をはらう必要があります。 ※ 0x43 は、C を意味する仮想キーコードです。 ※ (自由に変更可) ※ 仮想キーコードの一覧は こちら ※ 10 は、外部アプリを起動するまでの待機時間(ミリ秒) ※ (自由に変更可) ※ デスクトップに作成したショートカットは、別の方法で隠す予定です。 // ********************************************************* // CTRL+? を送った後、アプリケーションを実行する // 引数↓ // 1) 最初のスリープ( ミリ秒 ) // 2) 16進数の仮想キーコード // 3) 次のスリープ( ミリ秒 ) // 4) 実行コマンドライン // ********************************************************* #define _WIN32_WINNT 0x0500 #include <tchar.h> #include "lightbox\lightbox.h" #pragma comment( lib, "lightbox\\lightbox.lib" ) #pragma comment( lib, "shlwapi.lib" ) #define KEY_ACTION 4 // ********************************************************* // Windows アプリケーションとしてのエントリポイント // Link.exe で /SUBSYSTEM:WINDOWS がデフォルトで // 指定される事になります // ********************************************************* int APIENTRY _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) { // 引数の処理 char *ptr[4]; ptr[0] = strtok( lpCmdLine, " " ); // 最初のスリープ( ミリ秒 ) ptr[1] = strtok( NULL, " " ); // 16進数の仮想キーコード ptr[2] = strtok( NULL, " " ); // 次のスリープ( ミリ秒 ) int pos; for( pos = 1; pos < MAX_PATH; pos++ ) { if( *(ptr[2] + pos) == 0x00 ) { pos++; break; } } ptr[3] = ptr[2]+pos; // 実行コマンドライン int value[3]; // 整数に変換 value[0] = StrToInt( ptr[0] ); StrToIntEx( ptr[1], STIF_SUPPORT_HEX, &(value[1]) ); value[2] = StrToInt( ptr[2] ); if ( value[2] <= 0 ) { value[2] = 1; // 0 は特別な意味があるので 1 に変更 } // --------------------------------------------------------------- INPUT inkey[KEY_ACTION]; KEYBDINPUT ki[KEY_ACTION]; // 呼び出しにキーアクションを使う場合は、 // キーが押されていない状態になるのを待つ Sleep(value[0]); memset( ki, 0x00, sizeof( KEYBDINPUT ) * KEY_ACTION ); // キーの処理順序を作成 // CTRL↓ + ?↓ + ?↑ + CTRL↑ ki[0].wVk = VK_LCONTROL; ki[0].wScan = MapVirtualKey( ki[0].wVk, 0 ); ki[0].dwFlags = KEYEVENTF_EXTENDEDKEY; ki[1].wVk = value[1]; ki[1].wScan = MapVirtualKey( ki[1].wVk, 0 ); ki[1].dwFlags = KEYEVENTF_EXTENDEDKEY; ki[2].wVk = value[1]; ki[2].wScan = MapVirtualKey( ki[2].wVk, 0 ); ki[2].dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP; ki[3].wVk = VK_LCONTROL; ki[3].wScan = MapVirtualKey( ki[3].wVk, 0 ); ki[3].dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP; int i; for( i = 0; i < KEY_ACTION; i++ ) { inkey[i].type = INPUT_KEYBOARD; inkey[i].ki = ki[i]; } // キーの送信 int ret; ret = SendInput( KEY_ACTION, inkey, sizeof( INPUT ) ); Sleep(value[2]); // コマンドラインの実行 LboxExecute( ptr[3], NULL ); return 0; } |