トップページ > 過去ログ > 記事閲覧
SetAlwaysRunFlag()について
名前:ぷき 日時: 2010/03/13 22:23

いつもお世話になっています。 別のプログラムのスクリーンショットを非アクティブ時でも撮る処理をさせるため、SetAlwaysRunFlag(TRUE)を用いています。 そこで質問なのですが、 XPでは、アクティブ時・非アクティブ時にきちんとスクリーンショットを撮ることができましたが、 Vistaの場合、非アクティブ時のときスクリーンショットを撮ることができません。 複数のVistaのPCで試しましたが同様の結果となりました。 この関数をVistaのほうでもうまく動作を行わせたいのですが、どのようにしたらよろしいでしょうかご教授ください。

Page: 1 |

Re: SetAlwaysRunFlag()について ( No.1 )
名前:管理人 日時:2010/03/15 23:53

SaveDrawScreen関数を使用してスクリーンショットを作成するというのは如何でしょうか? 外部のソフトを使用して撮る場合ですが、XPとVista以降ですと画像処理周りのOS側の実装が かなり違いますので、スクリーンショットを撮るためのソフトを変更すると上手くいくかもしれません
Re: SetAlwaysRunFlag()について ( No.2 )
名前:ぷき 日時:2010/03/16 17:26

説明が下手ですみません。 自作のプログラムをタスクトレイに常駐させて、別のプログラム(ゲームなど)のスクリーンショットを撮ろうと考えています。 動作としては、 別のプログラム画面をメインで動作をさせつつCtrl+Sなどのコマンドを入力すると、自作プログラムのほうでスクリーンショットを撮る という動作です。 自作プログラムのSSのほうはSaveDrawScreenToJPEG()で愛用させていただいています。
Re: SetAlwaysRunFlag()について ( No.3 )
名前:管理人 日時:2010/03/22 01:33

そういうことでしたか・・・ というか、DXライブラリの機能を使用して他のソフトのスクリーンショットが撮れるということを知りませんでした(^ ^; なので、何故それが XP だと可能で、Vista 以降だと駄目なのかも推測以上のことは分かりません ただ、XP と Vista だと画像処理周りが相当変わった( 特に Aero を on にしている場合 )ということだけは知っていますので 恐らくその辺りが原因だと思います 申し訳ありませんが、Vista 以降でも使えるスクリーンショットソフトをお使いになってみてください JPEGやPNGで保存できるものもあった筈です
Re: SetAlwaysRunFlag()について ( No.4 )
名前:ぷき 日時:2010/03/29 20:29

返信遅くなりました。 Aeroをoffにした状態で確認したところ、同様に動きませんでした。画像以外にも他の動作でXPでは動くもののVistaでは動きません。 SetAlwaysRunFlag()はVistaでは使えないということでよろしいのでしょうか。
Re: SetAlwaysRunFlag()について ( No.5 )
名前:いっち 日時:2010/03/30 00:37

横から失礼します。興味があるので質問させて下さい。 ぷきさん> ぷきさんはVista上の"SetAlwaysRunFlag"関数についてどのような検証を行ったのでしょうか? もし宜しければお答え下さい。お願いします。 ※修正 ぷきさんのお名前を間違えておりました。大変失礼しました。
Re: SetAlwaysRunFlag()について ( No.6 )
名前:管理人 日時:2010/03/30 05:03

> ぷきさん 一般的な使い方をする限りでは SetAlwaysRunFlag はVistaでも機能しますが・・・ うーん、ぷきさんがお作りになられたソフトと同じ造りのシチュエーションを用意しないと その状況で SetAlwaysRunFlag が機能するかどうかの判断はできません・・・
Re: SetAlwaysRunFlag()について ( No.7 )
名前:Masao 日時:2010/03/30 10:26

横から失礼。 SaveDrawScreenToJPEG() の目的は、DXライブラリを使用したソフトのキャプチャであって、(そうですよね?) 他のアプリのキャプチャではありませんので、 Vista側が異常なのではなく、XP側のほうが異常なのでは?? (どのようにとられたのか分かりませんが、左上頂点を負の値にして、右下頂点をWindowsの画面いっぱいにしたのでしょうか?) (ちなみにこの方法でWindows7で検証したところ、画像の生成にも失敗しているようです。) ですから、本来の使い方以外、さらに勝手に作った用途での「正常」を期待するのは諦めたほうがいいと思います。 ここまでは、SaveDrawScreenToJPEG()についてのはなし。 ーーーーーーーーーーーーーーーー ちなみに SetAlwaysRunFlag は、Win7でも使えました。 (ちょっと前までVistaでしたが、それでも使えた気が・・・) やはり、皆様がおっしゃるようにどのように検証したのか記載していただけるといいかと思います。
Re: SetAlwaysRunFlag()について ( No.8 )
名前:ぷき 日時:2010/03/30 23:32

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ではうまくいかないようなのです。改善点・助言等ありましたらよろしくお願いします
Re: SetAlwaysRunFlag()について ( No.9 )
名前:Ma 日時:2010/03/31 00:16

すいません、以下の一文を誤解していたみたいです。 >別のプログラム画面をメインで動作をさせつつCtrl+Sなどのコマンドを入力すると、自作プログラムのほうでスクリーンショットを撮る という動作です。 >このように、「非アクティブ時のキー入力の認識」を SetAlwaysRunFlug()を使ってできればと思ったのですが、Vistaではうまくいかないようなのです。 そういうことでしたか。 こちら(Windows7)でも、その現象を確認しています。 てっきり、これが正常なのだと思っていましたが、XPではできるんですね。 ちょっと管理人さんの見解待ちになりそうです。
Re: SetAlwaysRunFlag()について ( No.10 )
名前:いっち 日時:2010/03/31 02:29

以下のスレッドとほぼ同じ事象のようですね。(TさんはXP側をおかしいと感じたようです) > ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1687 おそらくですが、SetAlwaysRunFlagに問題は無く、 CheckHitKey等のキー入力周りでXP以前とVista以降の差異が出ているのだと思います。 同じく、管理人さんの見解をお待ちになるのが宜しいかと思います。
Re: SetAlwaysRunFlag()について ( No.11 )
名前:管理人 日時:2010/04/05 01:48

すいません、No.2のお書き込みを読んでおきながら今までDXライブラリの SaveDrawScreenToJPEG を 使用して他アプリのスクリーンショットをお撮りになろうとしているのかと勘違いしていました XPで他アプリがアクティブになっていてもキーの押下状態を取得できるのは DirectInput を使用しているからで、 Vistaでも DirectInput を使用すれば他アプリがアクティブになっていてもキーの押下状態は取得できるのですが Vista 以降では押したことが正確に取得できないキーがあったり、デバッグ起動時の挙動が安定していなかったりと、 ( Vista 以降は DirectInput の使用は非推奨になったので仕様がないのですが・・・ )そんなこんなでデフォルトでは Vista 以降は DirectInput を使用ないようになっています ただ、今回のように使用したいキーの押下状態だけ正確に取得できれば問題ない場合は DirectInput を 使用するという選択肢もありだと思いましたので、それができるようにライブラリのプログラムを変更しました よろしければこちらをダウンロードしてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) 上記バージョンのDXライブラリで DxLib_Init を呼び出す前に SetUseDirectInputFlag( TRUE ) ; という記述を増やしてください、この関数は今までのバージョンにも存在していたものですが、これまでは 「DirectInput を使用しない」ようにするために使用するための関数で、DirectInput を強制的に使用するという 機能はありませんでした、今回 Vista 以降に使用された場合は「DirectInput を強制的に使用するかどうか」を 設定するための関数として動作しますので、よろしければお試し下さい m(_ _)m ( 因みに、私の手元ではお書き込み頂いたサンプルプログラムが Windows7 でも意図通りに動作することが確認できました )
Re: SetAlwaysRunFlag()について ( No.12 )
名前:ぷき 日時:2010/04/05 21:54

対応ありがとうございます。 SetUseDirectInputFlag( TRUE ) ;により、無事にVistaのほうでも動作を行うことが確認でき、非常に助かりました。 キー取得が問題だったのですね。いろいろ勉強になりました。 ありがとうございました。

Page: 1 |