Visual Studio デベロッパー センター > Visual Studio フォーラム > Visual Studio 共通 フォーラム > C++無限Loop関数内でのESCキーでのbreakとC#フォームのイベントの実行
質問する質問する
 

回答済みC++無限Loop関数内でのESCキーでのbreakとC#フォームのイベントの実行

  • 2009年9月30日 2:15クサキ ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    C++無限Loop関数でマウスやESCキーでbreakできるように、以下の関数を作って利用していました。

    int  KmBreak( void )
    {
      MSG  KBM_Msg;
      unsigned int Status;
      int  Ret = 0;
     
      HWND hWin = GetActiveWindow();
      if( PeekMessage(&KBM_Msg, hWin, WM_KEYFIRST, WM_MOUSELAST, PM_REMOVE) ) {    
        if ( KBM_Msg.message == WM_LBUTTONDOWN ) { Ret = 1; return( Ret ); }
        if ( KBM_Msg.message == WM_RBUTTONDOWN ) { Ret = 2; return( Ret ); }
        if ( KBM_Msg.message == WM_KEYDOWN ) {
          Status = GetKeyState( VK_ESCAPE );
            if ( Status >= 0x8000 ){ Ret = 3; return( Ret ); }
        }
      }
      return( Ret );
    }

    これはこれで利用できていたのですが、C#やVB6.0のフォームからこの無限Loopの関数を利用する場合、
    フォームやボタンのマウスやキーのイベントを拾うことができません。

    そこで、

    void KmDoEvents( void )  // (VB6.0のDoEventsのように感じたのでこんな名前にしています)
    {
      MSG msg;
      while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
    }

    のような関数を作り、無限Loop関数で、KmBreakの前に置くと、
    Formのイベントは拾えるようになりましたが、ESCキーなどが拾えなくなりました。

    両方拾える方法はありませんか?

     

回答

  • 2009年10月2日 6:27totojo ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み

    ウィンドウのメッセージ ループと無限Loop関数とを分けないといけないはずなので、無限Loop関数の方を別スレッドで実行することになると思います。
    SetEvent と WaitForSingleObject あたりを組み合わせる方が簡単に実装できるのではないでしょうか?

     ・マウスや ESC キーを押されたときの処理
      SetEvent します。

     ・無限Loop関数
      ループの先頭で WaitForSingleObject を呼びます。(待ち時間は 0 で良いはず)
       TIMEOUT が返ってきたら処理を続けます。
       イベントがセットされていたら処理を抜けます。

すべての返信

  • 2009年10月2日 6:27totojo ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み

    ウィンドウのメッセージ ループと無限Loop関数とを分けないといけないはずなので、無限Loop関数の方を別スレッドで実行することになると思います。
    SetEvent と WaitForSingleObject あたりを組み合わせる方が簡単に実装できるのではないでしょうか?

     ・マウスや ESC キーを押されたときの処理
      SetEvent します。

     ・無限Loop関数
      ループの先頭で WaitForSingleObject を呼びます。(待ち時間は 0 で良いはず)
       TIMEOUT が返ってきたら処理を続けます。
       イベントがセットされていたら処理を抜けます。

  • 2009年10月6日 9:17クサキ ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    良く分かりませんで、C#で新しい関数を作った方が早そうなのでそうすることにした。
    アドバイスを頂きましたが、役立てることができず申し訳ありません。
  • 2009年10月15日 7:34高橋 春樹MSFT, モデレータユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    フォーラムオペレーターの高橋春樹です。

    totojoさん、こんにちは。
    いつもアドバイスを頂きありがとうございます。

    クサキさん、初めまして。
    MSDNフォーラムのご利用ありがとうございます。
    確かにC#で作った方が簡単かもしれませんね・・・
    今回totojoさんからの情報が有用な情報だと思いましたので、
    勝手ながら、回答マークを付けさせてもらいました。

    今後ともMSDNフォーラムをよろしくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹