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キーなどが拾えなくなりました。
両方拾える方法はありませんか?