ページ 11

非アクティブのウィンドウを動作させたい

Posted: 2012年1月15日(日) 03:49
by びす
こんばんは

RPGツクール製ゲームのような
「非アクティブになると動作の停止するプログラム」を
「非アクティブ時にも動作させるプログラム」を作りたいと思っています

具体的には、指定のウィンドウを
Windowモードのゲームで非アクティブ時に画面がとまらない方法
で紹介されていることをした状態にしたいです

ウィンドウを列挙して選択させるところまでは順調にできたのですが
肝心の「非アクティブ時にも動作させる」部分をどうすればいいのかまるでわかりません...
アドバイスをお願いしたいです

よろしくおねがいします

Re: 非アクティブのウィンドウを動作させたい

Posted: 2012年1月15日(日) 12:12
by Fimbul
DXライブラリならSetAlwaysRunFlagと言う関数で実現できます。

ライブラリに何を使っているか分からないので的外れな事を書いているかも知れません。

Re: 非アクティブのウィンドウを動作させたい

Posted: 2012年1月15日(日) 23:23
by びす
返信ありがとうございます
まさにDXライブラリのSetAlwaysRunFlagを使った状態にしたいんですが
自作のゲームにではなくて、現在あるウィンドウを選択してSetAlwaysRunFlagしたいです

DXライブラリについて詳しくないので
指定のウィンドウをSetAlwaysRunFlagする方法があったらすみません
詳しく教えてもらえないでしょうか

ライブラリはおそらく使っていません
コンソールアプリケーションを作成して、ウィンドウを列挙させています
Microsoft Visual C++ 2010 Expressです

よろしくおねがいします

Re: 非アクティブのウィンドウを動作させたい

Posted: 2012年1月16日(月) 00:04
by softya(ソフト屋)
DXライブラリもそうですが、非アクティブで動作停止するプログラムはプログラムがそういう作りになっています。もし強引に動作停止をさせないようにするならプログラムを書き換えるぐらいしか手がないと思います。
紹介されているサイトの技はなんかWindows裏技っぽいですね。ちなみにDXライブラリのソフトはその技でも停止したままみたいです。

Re: 非アクティブのウィンドウを動作させたい

Posted: 2012年1月16日(月) 00:49
by びす
返信ありがとうございます

裏技の状態に故意にできれば・・・と思ったんですが、やっぱり難しいですね
プログラムの書き換えですか!ありがとうございます、調べてみます

こちらの環境ではDXライブラリのプログラムでも効くようです
動画もとってみました

よろしくおねがいします

Re: 非アクティブのウィンドウを動作させたい

Posted: 2012年1月16日(月) 09:08
by softya(ソフト屋)
私のWindows7(64bit)では、どうにも再現しません。OSのバージョンで動作が違うかも知れませんね。

とりあえず、マウスとキーボードを押したことを仮想的に行う方法を紹介します。
「Windows API - GUI プログラミング編 第2回 ~マウスメッセージとウィンドウ操作~」
http://yukki99.studio-web.net/stage/api_4-02.html
「キーボードイベント」
http://wisdom.sakura.ne.jp/system/winap ... win30.html

「Win32 メッセージ一覧」
http://wisdom.sakura.ne.jp/system/winapi/windata1.html

Re: 非アクティブのウィンドウを動作させたい

Posted: 2012年1月16日(月) 13:54
by びす
返信ありがとうございます

載せてくださったURLを参考に、
動作させたいウィンドウへWM_ACTIVATE(アクティブ時に送られるメッセージ)を送りつけたら、
見事に非アクティブ時に動作するようになりました

softyaさん、fimbulさん、ありがとうございました!

コード:

#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;

BOOL  CALLBACK  EnumWndProc(HWND hWnd, LPARAM lParam)
{
    char buff[256]="";
    GetWindowText(hWnd, buff, sizeof(buff));        //ハンドルからウィンドウ名を取得
    if(strstr(buff, (char*)lParam) != NULL){        //入力された名前と一致したら、
        cout << buff << endl << "アクティブ化" << endl; //アクティブ化
        SendMessage(hWnd, WM_ACTIVATE, WA_CLICKACTIVE, (LPARAM)hWnd);
    }
    return true;
}

int main(int argc, char* argv[])
{
    for(;;){
        char name[256];
        cout << "ウィンドウタイトルを入力" << endl;
        cin  >> name;

        //存在するウィンドウのハンドルを引数にしてEnumWndProcを呼び出す
        EnumWindows(EnumWndProc, (LPARAM)name);
    }

    return 0;
}