Masaoさんの仰るとおり、SaveDrawScreenToJPEG()は自ソフトのSSでのみ使っています。
SaveDrawScreenToJPEG()は他のキャプチャーには使用していません。
今回作成しようとしているプログラムの処理としては、
「非アクティブ処理」
1.常駐ソフト(自作プログラム)でアクティブ画面(別のプログラム画面)を監視。
2.Ctrl+Sのときスクリーンショットを撮り保存。
3.スクリーンショットから必要な部分(主に数値部分)を読み込み、別ファイルに保存。
「アクティブ処理」
1.抜き出した数値からシミュレーション(組み合わせパターンなどを検出)を行う。
2.組み合わせパターンなどを保存(SaveDrawScreenToJPEG()やcsv出力)。
といったソフトを作ろうと考えています。
XPでは非アクティブ処理は動作しているものの・・・Vistaを使用している知り合い(5人程)は動作をしないとのことです。
以下に検証ソースを貼ります。
どのような検証を行ったかというと、簡単な実行ファイルを3つ作り、XPとVistaでそれぞれ実行してみました。
・testess.exe メインプログラム。アクティブ時にCtrl+Sを押すとtest1を起動、非アクティブ時にはtest2を起動。
・test1.exe アクティブ時に起動されるプログラム。
・test2.exe 非アクティブ時に起動されるプログラム。
//---testess.exe---
#include "Dxlib.h"
int MouseX, MouseY, key, check ;
NOTIFYICONDATA nid ;
int WINAPI WinMain( HINSTANCE hI, HINSTANCE hp, LPSTR lpC, int nC )
{
int count=0 ;
//タイトル変更
SetWindowText( "検証" ) ;
//ログ出力を行わない
SetOutApplicationLogValidFlag( FALSE ) ;
//ウィンドウモードの指定
ChangeWindowMode(1) ;
//画面のサイズを変更
SetGraphMode( 800, 600, 32 ) ;
//IMEをONにする(全角入力を使用可)
SetUseIMEFlag( TRUE ) ;
//ウインドウのサイズを変更できるかどうかのフラグをセット
SetWindowSizeChangeEnableFlag( TRUE, FALSE ) ;
//多重起動の有無
SetDoubleStartValidFlag( TRUE ) ;
//DXライブラリ初期化
if( DxLib_Init() == -1 )
{
return -1 ;
}
//ウインドウがアクティブではない状態でも処理を続行
SetAlwaysRunFlag( TRUE ) ;
// SetHookWinProc( HookDxLibMessage ) ;
//透過色を変更
SetTransColor( 1, 255, 1 ) ;
//描画対象画面の指定
SetDrawScreen( DX_SCREEN_BACK ) ;
//初期データ取得
// Date(0) ;
//メインループ
while( ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0 )
{
//画面の消去
ClsDrawScreen() ;
//キー判定
key = GetJoypadInputState(DX_INPUT_KEY_PAD1) ;
//マウスポイント取得
GetMousePoint( &MouseX , &MouseY ) ;
//アクティブ時
if( GetWindowActiveFlag() == TRUE )
{
//CTRL+Sを入力時
if( CheckHitKey( KEY_INPUT_LCONTROL )!=0 && CheckHitKey( KEY_INPUT_S )!=0 && check==0 )
{
STARTUPINFO si ;
PROCESS_INFORMATION pi ;
ZeroMemory(&si, sizeof(si)) ;
si.cb = sizeof(si) ;
ZeroMemory(&pi, sizeof(pi)) ;
CreateProcess( NULL, "test1.exe", NULL, NULL, FALSE, 0x00000030, NULL, NULL, &si, &pi ) ;
//クリック維持判定
check = 1 ;
}
}
//非アクティブ時
else
{
//CTRL+Sを入力時
if( CheckHitKey( KEY_INPUT_LCONTROL )!=0 && CheckHitKey( KEY_INPUT_S )!=0 && check==0 )
{
STARTUPINFO si ;
PROCESS_INFORMATION pi ;
ZeroMemory(&si, sizeof(si)) ;
si.cb = sizeof(si) ;
ZeroMemory(&pi, sizeof(pi)) ;
CreateProcess( NULL, "test2.exe", NULL, NULL, FALSE, 0x00000030, NULL, NULL, &si, &pi ) ;
//クリック維持判定
check = 1 ;
}
}
//カーソルを何も押していないとき
if( CheckHitKeyAll() == 0 )
{
check = 0 ;
}
//画面の切り替え
ScreenFlip() ;
}
nid.cbSize = sizeof(NOTIFYICONDATA) ;
nid.hWnd = NULL ;
nid.uID = 0 ;
nid.uFlags = 0 ;
nid.uCallbackMessage = 0 ;
nid.hIcon = 0 ;
Shell_NotifyIcon( NIM_DELETE, &nid ) ;
//DXライブラリ終了処理
DxLib_End() ;
//終了
return 0 ;
}
//---ここまで---
//---test1.exe---
int main()
{
char a ;
printf( "アクティブ起動しました" ) ;
scanf( "%c", &a ) ;
return 0 ;
}
//---ここまで---
//---test2.exe---
int main()
{
char a ;
printf( "非アクティブ起動しました" ) ;
scanf( "%c", &a ) ;
return 0 ;
}
//---ここまで---
これら3つのファイルを同一フォルダに入れて実行・検証したところ、XPではtest1,2両方の起動ができましたが、Vistaではtest1の起動はできましたがtest2が起動しませんでした。
このように、「非アクティブ時のキー入力の認識」を SetAlwaysRunFlug()を使ってできればと思ったのですが、Vistaではうまくいかないようなのです。改善点・助言等ありましたらよろしくお願いします