LRESULT CConfigDialog::WindowProc(UINT msg, WPARAM wp, LPARAM lp) { if (msg == RWM_PRETRANSLATEMSG) { MSG* pMsg = (MSG*)lp; ASSERT(pMsg); HWND hWndStop = this->GetSafeHwnd(); ASSERT(hWndStop == NULL || ::IsWindow(hWndStop)); //Loop through all windows from the receiver of the message to the highest ancestor for (HWND hWnd = pMsg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd)) { CWnd* pWnd = CWnd::FromHandlePermanent(hWnd); if (pWnd != NULL) if (pWnd->PreTranslateMessage(pMsg)) return TRUE; if (hWnd == hWndStop) break; } return FALSE; //do nothing } return MyDialog::WindowProc(msg, wp, lp); }
BOOL CDlgResLib::PreTranslateMessage(MSG* pMsg) { ASSERT_VALID(this); ASSERT(m_hWnd != NULL); CWnd* pOwner = GetOwner(); // don't translate dialog messages when in Shift+F1 help mode CFrameWnd* pFrameWnd = GetTopLevelFrame(); if (pFrameWnd != NULL && pFrameWnd->m_bHelpMode) return FALSE; // since 'IsDialogMessage' will eat frame window accelerators, // we call all frame windows' PreTranslateMessage first while (pOwner != NULL) { // allow owner & frames to translate before IsDialogMessage does if (pOwner->PreTranslateMessage(pMsg)) return TRUE; // try parent frames until there are no parent frames if (IsWindow (pOwner->GetSafeHwnd ())) { pOwner = pOwner->GetParentFrame(); } else { break; } } return CDialogEx::PreTranslateMessage(pMsg); }
BOOL AfxInternalPreTranslateMessage(MSG* pMsg) { // ASSERT_VALID(this); CWinThread *pThread = AfxGetThread(); if( pThread ) { // if this is a thread-message, short-circuit this function if (pMsg->hwnd == NULL && pThread->DispatchThreadMessageEx(*pMsg)) return TRUE; } // walk from target to main window CWnd* pMainWnd = AfxGetMainWnd(); if (CWnd::WalkPreTranslateTree(pMainWnd->GetSafeHwnd(), pMsg)) return TRUE; // in case of modeless dialogs, last chance route through main // window's accelerator table if (pMainWnd != NULL) { CWnd* pWnd = CWnd::FromHandle(pMsg->hwnd); if (pWnd->GetTopLevelParent() != pMainWnd) return pMainWnd->PreTranslateMessage(pMsg); } return FALSE; // no special processing }
BOOL CControlBar::PreTranslateMessage(MSG* pMsg) { ASSERT_VALID(this); ASSERT(m_hWnd != NULL); // handle mouse messages for tooltip support if (m_dwStyle & (CBRS_FLYBY|CBRS_TOOLTIPS)) FilterToolTipMsg(pMsg->message, pMsg->pt); // don't translate dialog messages when in Shift+F1 help mode CFrameWnd* pFrameWnd = GetTopLevelFrame(); if (pFrameWnd != NULL && pFrameWnd->m_bHelpMode) return FALSE; // since 'IsDialogMessage' will eat frame window accelerators, // we call all frame windows' PreTranslateMessage first CWnd* pOwner = GetOwner(); // always use owner first while (pOwner != NULL) { // allow owner & frames to translate before IsDialogMessage does if (pOwner->PreTranslateMessage(pMsg)) return TRUE; // try parent frames until there are no parent frames pOwner = pOwner->GetParentFrame(); } // filter both messages to dialog and from children return PreTranslateInput(pMsg); }
BOOL CPropertyPageHost::PreTranslateMessage(MSG* pMsg) { CWnd* pActive = GetActivePage(); if (pActive) { if (pActive->PreTranslateMessage(pMsg)) return TRUE; else if (pActive->IsDialogMessage(pMsg)) return TRUE; } return FALSE; }
bool CWinThread::PreTranslateMessage(MSG& msg) { // if this is a thread-message, short-circuit this function if (msg.hwnd == NULL && DispatchThreadMessageEx(msg)) return true; // walk from target to main window CWnd *pMainWnd = AfxGetMainWnd(); if (CWnd::WalkPreTranslateTree(pMainWnd->GetSafeHwnd(), &msg)) return true; // in case of modeless dialogs, last chance route through main // window's accelerator table if (pMainWnd != NULL) { CWnd* pWnd = CWnd::FromHandle(msg.hwnd); if (pWnd->GetTopLevelParent() != pMainWnd) return pMainWnd->PreTranslateMessage(&msg); } return false; }
BOOL CWinThread::PreTranslateMessage( MSG *pMsg ) /***********************************************/ { HWND hMainWnd = m_pMainWnd->GetSafeHwnd(); HWND hWnd = pMsg->hwnd; if( hWnd == NULL ) { DispatchThreadMessage( pMsg ); return( TRUE ); } while( hWnd != NULL && hWnd != hMainWnd ) { CWnd *pWnd = CWnd::FromHandlePermanent( hWnd ); if( pWnd != NULL && pWnd->PreTranslateMessage( pMsg ) ) { return( TRUE ); } hWnd = ::GetParent( hWnd ); } if( m_pMainWnd != NULL ) { return( m_pMainWnd->PreTranslateMessage( pMsg ) ); } return( FALSE ); }
BOOL InformApp::PreTranslateMessage(MSG* pMsg) { if ((pMsg->hwnd == NULL) && DispatchThreadMessageEx(pMsg)) return TRUE; CArray<CFrameWnd*> frames; GetWindowFrames(frames); CWnd* wnd = CWnd::FromHandle(pMsg->hwnd); for (int i = 0; i < frames.GetSize(); i++) { CFrameWnd* frame = frames[i]; if (wnd->GetTopLevelParent() == frame) return CWnd::WalkPreTranslateTree(frame->GetSafeHwnd(),pMsg); } CWnd* mainWnd = AfxGetMainWnd(); if (mainWnd != NULL) return mainWnd->PreTranslateMessage(pMsg); return FALSE; }
INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow ) { #if _DEBUG // メモリリーク検出 int Flag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); Flag |= _CRTDBG_LEAK_CHECK_DF; Flag &= ~_CRTDBG_CHECK_ALWAYS_DF; _CrtSetDbgFlag( Flag ); #endif // 簡易ウィルスチェック if( SimpleVirusChecker() > 0 ) { if( ::GetUserDefaultLCID() == 0x0411 ) { if( ::MessageBox( NULL, "このPCはウィルスプログラムに感染している可能性があります。\n" "危険ですのでなるべく早急にウィルスチェックを行って下さい。\n\n" "それでも実行しますか?", "VirtuaNES 簡易ウィルスチェッカー", MB_ICONWARNING|MB_YESNO|MB_DEFBUTTON2 ) == IDNO ) return -1L; } else { if( ::MessageBox( NULL, "This PC may be infected with a virus program!!!\n" "Should become danger, and please do a check to it immediately!!!\n\n" "Do execute even it?", "VirtuaNES simple virus checker", MB_ICONWARNING|MB_YESNO|MB_DEFBUTTON2 ) == IDNO ) return -1L; } } // メインフレームウインドウオブジェクト CMainFrame MainFrame; // Mutex HANDLE hMutex = NULL; // アプリケーションインスタンス等の設定 CHAR szPath[ _MAX_PATH ]; GetModuleFileName( hInstance, szPath, sizeof(szPath) ); string ModulePath = CPathlib::SplitPath( szPath ); CApp::SetModulePath( ModulePath.c_str() ); DEBUGOUT( "Module Path:\"%s\"\n", ModulePath.c_str() ); CApp::SetInstance( hInstance ); CApp::SetPrevInstance( hPrevInstance ); CApp::SetCmdLine( lpCmdLine ); CApp::SetCmdShow( nCmdShow ); //DEBUGOUT( "ThreadID:%08X\n", ::GetCurrentThreadId() ); // CRegistry::SetRegistryKey( "Emulators\\VirtuaNES" ); CRegistry::SetRegistryKey( "VirtuaNES.ini" ); if( !CPlugin::FindPlugin( CApp::GetModulePath() ) ) { ::MessageBox( NULL, "Language plug-in is not found.", "VirtuaNES", MB_ICONERROR|MB_OK ); goto _Error_Exit; } DEBUGOUT( "Plugin Path:\"%s\"\n", CPlugin::GetPluginPath() ); DEBUGOUT( "Language :\"%s\"\n", CPlugin::GetPluginLanguage() ); DEBUGOUT( "LCID :\"%d\" \"0x%04X\"\n", CPlugin::GetPluginLocaleID(), CPlugin::GetPluginLocaleID() ); HINSTANCE hPlugin; if( !(hPlugin = CPlugin::LoadPlugin()) ) { ::MessageBox( NULL, "Language plug-in load failed.", "VirtuaNES", MB_ICONERROR|MB_OK ); goto _Error_Exit; } CApp::SetPlugin( hPlugin ); ::InitCommonControls(); // 設定のロード CRegistry::SetRegistryKey( "VirtuaNES.ini" ); Config.Load(); CRecent::Load(); // 二重起動の防止 hMutex = ::CreateMutex( NULL, FALSE, VIRTUANES_MUTEX ); if( ::GetLastError() == ERROR_ALREADY_EXISTS ) { ::CloseHandle( hMutex ); if( Config.general.bDoubleExecute ) { HWND hWnd = ::FindWindow( VIRTUANES_WNDCLASS, NULL ); // HWND hWnd = ::FindWindow( VIRTUANES_WNDCLASS, VIRTUANES_CAPTION ); CHAR szTitle[256]; ::GetWindowText( hWnd, szTitle, sizeof(szTitle)-1 ); // タイトルバーが同じかどうかチェック if( ::strncmp( szTitle, VIRTUANES_CAPTION, ::strlen(VIRTUANES_CAPTION) ) == 0 ) { // 起動していた方をフォアグラウンドにする ::SetForegroundWindow( hWnd ); // コマンドライン引数があるなら動作中のVirtuaNESのウインドウにファイル名 // メッセージを送りつけてそちらで動作させる // (当然の様に対応バージョンでないとダメ) if( ::strlen( lpCmdLine ) > 0 ) { CHAR szCmdLine[_MAX_PATH]; ::strcpy( szCmdLine, lpCmdLine ); ::PathUnquoteSpaces( szCmdLine ); COPYDATASTRUCT cds; cds.dwData = 0; cds.lpData = (void*)szCmdLine; cds.cbData = ::strlen(szCmdLine)+1; // 終端のNULLも送る // 文字列送信 ::SendMessage( hWnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cds ); } // 終了 goto _DoubleExecute_Exit; } } } if( !MainFrame.Create(NULL) ) goto _Error_Exit; DEBUGOUT( "CreateWindow ok.\n" ); // メインウインドウの表示 ::ShowWindow( CApp::GetHWnd(), CApp::GetCmdShow() ); ::UpdateWindow( CApp::GetHWnd() ); // フック CWndHook::Initialize(); // ランチャー同時起動 if( Config.general.bStartupLauncher ) { ::PostMessage( CApp::GetHWnd(), WM_COMMAND, ID_LAUNCHER, 0 ); } // コマンドライン if( ::strlen( lpCmdLine ) > 0 ) { LPSTR pCmd = lpCmdLine; if( lpCmdLine[0] == '"' ) { // Shell execute!! lpCmdLine++; if( lpCmdLine[::strlen( lpCmdLine )-1] == '"' ) { lpCmdLine[::strlen( lpCmdLine )-1] = '\0'; } } } if( ::strlen( lpCmdLine ) > 0 ) { ::PostMessage( CApp::GetHWnd(), WM_VNS_COMMANDLINE, 0, (LPARAM)lpCmdLine ); } MSG msg; BOOL bRet; while( (bRet = ::GetMessage( &msg, NULL, 0, 0 )) != 0 ) { // エラー? if( bRet == -1 ) break; // メインウインドウのメッセージフィルタリング if( CApp::GetHWnd() == msg.hwnd ) { CWnd* pWnd = (CWnd*)::GetWindowLong( msg.hwnd, GWL_USERDATA ); if( pWnd ) { if( pWnd->PreTranslateMessage( &msg ) ) continue; } } if( CWndList::IsDialogMessage( &msg ) ) continue; ::TranslateMessage( &msg ); ::DispatchMessage( &msg ); } // フック CWndHook::Release(); // 設定の保存 CRegistry::SetRegistryKey( "VirtuaNES.ini" ); Config.Save(); CRecent::Save(); // DirectX系破棄 DirectDraw.ReleaseDDraw(); DirectSound.ReleaseDSound(); DirectInput.ReleaseDInput(); if( hMutex ) ::ReleaseMutex( hMutex ); CLOSEHANDLE( hMutex ); _DoubleExecute_Exit: ::FreeLibrary( CApp::GetPlugin() ); return msg.wParam; _Error_Exit: // DirectX系破棄 DirectDraw.ReleaseDDraw(); DirectSound.ReleaseDSound(); DirectInput.ReleaseDInput(); if( CApp::GetPlugin() ) { ::FreeLibrary( CApp::GetPlugin() ); } return -1; }
BOOL CControlBar::PreTranslateMessage(MSG* pMsg) { ASSERT_VALID(this); ASSERT(m_hWnd != NULL); // allow tooltip messages to be filtered if (CWnd::PreTranslateMessage(pMsg)) return TRUE; UINT message = pMsg->message; CWnd* pOwner = GetOwner(); // handle CBRS_FLYBY style (status bar flyby help) if (((m_dwStyle & CBRS_FLYBY) || message == WM_LBUTTONDOWN || message == WM_LBUTTONUP) && ((message >= WM_MOUSEFIRST && message <= AFX_WM_MOUSELAST) || (message >= WM_NCMOUSEFIRST && message <= WM_NCMOUSELAST))) { AFX_MODULE_THREAD_STATE* pModuleThreadState = AfxGetModuleThreadState(); // gather information about current mouse position CPoint point = pMsg->pt; ScreenToClient(&point); TOOLINFO ti; memset(&ti, 0, sizeof(TOOLINFO)); ti.cbSize = sizeof(AFX_OLDTOOLINFO); INT_PTR nHit = OnToolHitTest(point, &ti); if (ti.lpszText != LPSTR_TEXTCALLBACK) free(ti.lpszText); BOOL bNotButton = message == WM_LBUTTONDOWN && (ti.uFlags & TTF_NOTBUTTON); if (message != WM_LBUTTONDOWN && GetKeyState(VK_LBUTTON) < 0) nHit = pModuleThreadState->m_nLastStatus; // update state of status bar if (nHit < 0 || bNotButton) { if (GetKeyState(VK_LBUTTON) >= 0 || bNotButton) { SetStatusText(static_cast<INT_PTR>(-1)); KillTimer(ID_TIMER_CHECK); } } else { if (message == WM_LBUTTONUP) { SetStatusText(static_cast<INT_PTR>(-1)); ResetTimer(ID_TIMER_CHECK, 200); } else { if ((m_nStateFlags & statusSet) || GetKeyState(VK_LBUTTON) < 0) SetStatusText(nHit); else if (nHit != pModuleThreadState->m_nLastStatus) ResetTimer(ID_TIMER_WAIT, 300); } } pModuleThreadState->m_nLastStatus = nHit; } // don't translate dialog messages when in Shift+F1 help mode CFrameWnd* pFrameWnd = GetTopLevelFrame(); if (pFrameWnd != NULL && pFrameWnd->m_bHelpMode) return FALSE; // since 'IsDialogMessage' will eat frame window accelerators, // we call all frame windows' PreTranslateMessage first while (pOwner != NULL) { // allow owner & frames to translate before IsDialogMessage does if (pOwner->PreTranslateMessage(pMsg)) return TRUE; // try parent frames until there are no parent frames pOwner = pOwner->GetParentFrame(); } // filter both messages to dialog and from children if (::IsWindow(m_hWnd)) return PreTranslateInput(pMsg); return FALSE; }