• ベストアンサー

WINAPI ウィンドウの移動中も処理を続けるには

お世話になります。 現在、Windowsでゲームを制作しています。 WinMain()内でウィンドウを作り、 その後ループをさせてゲームを処理させているのですが、 ウィンドウをドラッグして移動している最中、このループ内に処理が入ってきません。 ウィンドウを移動している最中も、ゲームの処理の更新や音声のストリーミングなどを続けたいのですが、 ウィンドウ生成時、ウィンドウプロシージャの処理でこれが実現できるでしょうか? できないとすれば、ウィンドウ移動中にプログラムを走らせ続けるにはどうしたらよいでしょうか? ご存知の方がいらっしゃいましたら、是非ご教授宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

スレッドを作成しましょう。 "win api thread" とかで検索すると、参考になるサイトが見つかると思います。

yoshi_abaver
質問者

お礼

ありがとうございます。 スレッドを作成することで解決できました! なるほど、こういうときのためにスレッドがあるのですね。 勉強になりました。

関連するQ&A

  • DXライブラリについて(ゲームプログラミング)

    今までVisualC++.netでWinAPIを使ってアクションゲームを 作っていたのですが、最近DXライブラリを使い出しました。 今までは一定時間ごとにメインループとは別に自動的に行われる 処理はウィンドウプロシージャでSetTimerして case WM_TIMER:に処理を書くことで実現していたのですが、 DXライブラリの場合それにあたる機能はあるのでしょうか。 たとえばメインループとは別に1秒おきにある変数をTRUEにしたり FALSEにしたりしたい場合、ウィンドウプロシージャでやるしかないのでしょうか?

  • WinAPIでタブ付きのウィンドウを作成

    現在WinAPI(C++)でタブ付きのウィンドウを作成しようと思っているのですが、 タブコントロールとしてCreateWindowEX関数+WC_TABCONTROLで作成するしかないのでしょうか? 認識不足なら申し訳ありませんが、これはダイアログボックス内にタブを作成するものでしょうか? 行いたいのは、タブで切り替えれる+画像の描画可能+サイズの変更可能なウィンドウなのですが、 また、タブのデザインも変更できればいいんですが・・・ Visualやイラストレータのようなドラッグでウィンドウを移動させてタブから切り離し+ 再度タブ化するのは、どのように実現しているのでしょうか 開発環境はMicrosoft Visual C++ 2010 Expressです。 状況説明不足で申し訳ありませんが、ご教示お願いします。

  • スレッド中でウインドウのイベント(Windows)

    カテゴリー違いかもしれませんが、 Windowsでスレッド中でウインドウを生成すると、 イベントの処理ができなくなります。 (たぶんもとのイベントループにメッセージがいって  そこで終わっていると思うのですが) これを避ける方法とかあるのでしょうか? メインループにメッセージを送ってそこでウインドウを 生成してもらうのが由緒正しい方法なのでしょうか? 用語とかむちゃくちゃかもしれませんが よろしくお願いします。

  • ウィンドウ内でマウスが乗ると更新が止まります・・

    ウィンドウプロシージャ周りを触っているのですが、  ・ウィンドウにマウスが乗っていつつ、マウスが動いている時  ・キーボードーを押した瞬間 にメインループに処理が回らず 全体の処理が止まってしまいます。 上の問題を解決するには、どうすれば良いでしょうか? ※以下コード ---------------------------------------------- while(TRUE) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if(msg.message == WM_QUIT) { break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { // 処理メッセージが無いとき WINDOWPLACEMENT wndpl; GetWindowPlacement(hWnd, &wndpl); if((wndpl.showCmd != SW_HIDE) && (wndpl.showCmd != SW_MINIMIZE) && (wndpl.showCmd != SW_SHOWMINIMIZED) && (wndpl.showCmd != SW_SHOWMINNOACTIVE)) { ... ゲームのような、常時更新が必要なループ処理 ... } } Sleep(1); // 最小化等でフリーズしないため } ---------------------------------------------- //以下メッセージ処理側の一部 case WM_KEYDOWN: if (wParam == VK_ESCAPE) { PostQuitMessage(0); } break; case WM_MOUSEMOVE: return DefWindowProc(hWnd, msg, wParam, lParam); default: return DefWindowProc(hWnd, msg, wParam, lParam); ---------------------------------------------- また、ゲームなどのリアルタイム更新に向いた ウィンドウプロシージャの作り方などの説明サイト等ご存知でしたら そちらも教えて頂けると幸いです。

  • [Windowsプログラミング] スレッドでリアルタイムにキーボード入力を処理したいのですが

    いつもお世話になっております。 最近Windowsプログラミングを始めたばかりです。 今スレッドの勉強をしているのですが、キーボードの入力をスレッドが処理したいと考えております。 受け渡しでは生成時点での入力しか処理できず、うまくいきません。 プロシージャとスレッドでリアルタイムにデータをやり取りする方法はないでしょうか? ご指導よろしくお願いします。

  • msgが定義されていない

    Visual Studio2019でwindowsアプリケーションでゲームを作っているんですが、 どうやってもmsgが定義されていないが直りません。 #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); //WinMain関数 int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { //ウィンドウクラスの登録 //メインウィンドウの生成 //メッセージループ return (int)msg.wParam; } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { //メッセージごとにやりたいことを記述する } return 0; } ご教示お願いします。

  • 使われないウィンドウメッセージ

    ウィンドウプロシージャをウィンドウメッセージを受け取るだけでなく、個人的なメッセージを送ってシグナル関数の代用にしたいなと思ったのですが、ウィンドウズが使っていない、これから使われないウィンドウメッセージの値はありますか?プロセス間でのシグナル受け渡しのため、ウィンドウプロシージャをシグナル関数の代用にすると、メッセージループがそのまま使えて好都合なのです。 今は処理する必要が無いウィンドウメッセージを代用として使っていますが、何だかスマートではないのでそういうウィンドウメッセージがあれば教えてください。例えば9x系で使われていたが、NTでは使用されないウィンドウメッセージ等。 回答よろしくお願いします。

  • アクティブウィンドウのドラッグ移動に関する質問

    使っているパソコンはDELLのStudio15で OSはWindows7 32bit版なのですが フォルダやマイコンピュータ等を開いたもの または インターネット、Word等を開いたもの 全てに当てはまるのですが 例えば複数ブラウザを開いていて 例えば、インターネットを2つ開いていたとします。 片方のインターネットではゲーム 片方のインターネットではYoutube等の動画 ページを開いていたとします。 ゲームをしながら 動画を見たいという時とかは 2つのインターネットをそれぞれ 右上の元に戻す(縮小)ボタンで 小さくして 画面上に2つを 左右(または上下)に並べて ゲームをしながら動画も見れるようにします。 この際、縮小ボタンを押した後 そのブラウザの上部をドラッグしながら 移動させたい位置までもっていきますよね? その際に、ドラッグしながら移動させてる間に 何らかの動作が加わってしまうと ドラッグでマウスのボタンを離した後に 元の大きさ(パソコン画面全体の大きさ)に戻ってしまうことがあるんです。 これはOSを7にしてからこういうことが起こるようになったのですが 毎回起こるわけでもなく でも、結構頻繁に起こっていて、 少々面倒で困っています。 なぜこういうことがおこるのでしょうか?

  • ウィンドウハンドルがメッセージ処理ループの後おかしくなる(?)

    下のコードをコンパイルしても、 WinMain KillTimer hr=ERROR_INVALID_WINDOW_HANDLE (0x00000578) というエラーメッセージが出てうまく通りません。 エラーを無視する意味でKillTimerをせずにやってしまえば、特に問題ないのですが、後々問題が出てきても怖いので、直したいです。 メッセージ処理ループの手前でKillTimerを行うと、エラーは出ませんし、 メッセージ処理ループのすぐ後でSetTimerを行うと、SetTimerでエラーが出るので、 ループでおかしくなるのかな、と思いました。 プログラムをシェイプアップしてもエラーがとれませんし、 もしかして根本的な間違いがあるのでしょうか・・・? #include <windows.h> #include <dxerr9.h> #define kWCLASS_NAME "WndClass" // ウィンドウクラス名 #define kWINDOW_NAME "Wnd" // ウィンドウ名 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInst; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName =NULL; wcex.lpszClassName = kWCLASS_NAME; wcex.hIconSm = NULL; RegisterClassEx(&wcex); /* --- メイン・ウィンドウの作成 --- */ HWND hWnd; hWnd = CreateWindow(kWCLASS_NAME, kWINDOW_NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL); /* --- ウィンドウの表示 --- */ ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); /* --- タイマのセット --- */ if ( SetTimer( hWnd, 1, 1000, NULL ) == 0 ) // WM_TIMERはWndProcで処理 { DXTRACE_ERR( "WinMain SetTimer", GetLastError() ); return -1; } /* --- メッセージ処理ループ --- */ MSG msg; ZeroMemory( &msg, sizeof( msg ) ); while ( msg.message != WM_QUIT ) // PostQuitMessage()が呼ばれたら終了 { if ( !GetMessage( &msg, NULL, 0, 0 ) ) { msg.message = WM_QUIT; } else { TranslateMessage( &msg ); DispatchMessage( &msg ); } } /* --- タイマの破棄 --- */ if ( KillTimer( hWnd, 1 ) == 0 ) { DXTRACE_ERR( "WinMain KillTimer", GetLastError() ); return -1; } /* --- 終了処理 --- */ // ウィンドウクラスの登録解除 if ( UnregisterClass( kWCLASS_NAME, hInst ) == 0 ) { DXTRACE_ERR( "WinMain UnregisterClass", GetLastError() ); return -1; } return 0; }

  • ダイアログウィンドウの初期化メッセージ

    Win32API入門(http://wisdom.sakura.ne.jp/system/winapi/)を見ながら、BCC32でGUIプログラミングの勉強をしています。 現在、以下URLのサンプルのように、ダイアログアプリケーションとして自作のソフトを作ろうとしています。 http://wisdom.sakura.ne.jp/system/winapi/win32/win89.html さて、通常のダイアログ上のコントロールを初期化する際は、ウィンドウプロシージャでWM_INITDIALOGを補足するのが常套手段だと思いますが、上記サンプルのように、ダイアログアプリケーションとしてダイアログを生成した場合、WM_INITDIALOGが発行されないようです。 そこで、WM_CREATEを利用しようとしましたが、WM_CREATEが発行された時点では、GetDlgItem()等によるダイアログ上のコントロールのハンドル取得ができないようで、困ってしまいました。 ダイアログアプリケーションの初期化は、どのように行うのが正しいのでしょうか? WinMain()で、CreateDialog()の直後に初期化処理を行えば、ひとまず目的は達成するのですが、WinMain()内での処理は何となく邪道のような気がして、質問させていただきました。