CTRL+(何らかのキー) を送った後、アプリケーションを実行する

ビルドパッケージ(ソース+バイナリ) : 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;
}