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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
びす
記事: 31
登録日時: 13年前

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

#1

投稿記事 by びす » 13年前

こんばんは

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

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

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

よろしくおねがいします

Fimbul
記事: 100
登録日時: 14年前

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

#2

投稿記事 by Fimbul » 13年前

DXライブラリならSetAlwaysRunFlagと言う関数で実現できます。

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

アバター
びす
記事: 31
登録日時: 13年前

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

#3

投稿記事 by びす » 13年前

返信ありがとうございます
まさにDXライブラリのSetAlwaysRunFlagを使った状態にしたいんですが
自作のゲームにではなくて、現在あるウィンドウを選択してSetAlwaysRunFlagしたいです

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

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

よろしくおねがいします
最後に編集したユーザー びす on 2012年1月16日(月) 02:13 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 13年前

DXライブラリもそうですが、非アクティブで動作停止するプログラムはプログラムがそういう作りになっています。もし強引に動作停止をさせないようにするならプログラムを書き換えるぐらいしか手がないと思います。
紹介されているサイトの技はなんかWindows裏技っぽいですね。ちなみにDXライブラリのソフトはその技でも停止したままみたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
びす
記事: 31
登録日時: 13年前

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

#5

投稿記事 by びす » 13年前

返信ありがとうございます

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

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

よろしくおねがいします

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 13年前

私の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
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
びす
記事: 31
登録日時: 13年前

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

#7

投稿記事 by びす » 13年前

返信ありがとうございます

載せてくださった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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る