获取HWND用API GetConsoleWindow,获取HINSTANCE使用GetModuleHandle(NULL)。 比如说: #include <Windows.h> #include <tchar.h> #include <iostream> #include <map> using namespace std; namespace dbsoft { class CSplashWindow { public: CSplashWindow( HINSTANCE hInst, std::basic_string<TCHAR> strBmp ):m_hInstance(hInst),m_hWnd(NULL),m_hBitMap(NULL),m_hThread(NULL), \ m_strBmpFile( strBmp ) { } ~CSplashWindow() { Stop(); } inline bool Show() { TCHAR szClassName[MAX_PATH]; _stprintf_s( szClassName, _T("SplashScreenClass%d"), (int)this ); m_strClassName = szClassName; WNDCLASS wc; wc.style = 0; wc.lpfnWndProc = (WNDPROC) SplashScreenWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = m_hInstance; wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION); wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szClassName; if(!RegisterClass(&wc)) { return 0; } m_hBitMap = (HBITMAP) LoadImage( m_hInstance, m_strBmpFile.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); if( m_hBitMap == NULL ) { return false; } m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SplashScreenWorkThread, this, 0, NULL); return true; } inline void Stop() { if(m_hThread) { if(m_hWnd) { PostMessage(m_hWnd, WM_DESTROY, 0, 0); } WaitForSingleObject(m_hThread, INFINITE); unRegisterWindow( this ); CloseHandle(m_hThread); m_hThread = NULL; m_hWnd = NULL; } } inline HINSTANCE GetIns() const { return m_hInstance; } inline HBITMAP GetBitmap() const { return m_hBitMap; } inline HWND GetWnd() const { return m_hWnd; } inline void SetWnd( HWND hWnd ) { m_hWnd = hWnd; } inline std::basic_string<TCHAR> GetClassName() const { return m_strClassName; } private: HINSTANCE m_hInstance; HWND m_hWnd; HANDLE m_hThread; std::basic_string<TCHAR> m_strBmpFile; std::basic_string<TCHAR> m_strClassName; HBITMAP m_hBitMap; static inline std::map<HWND, CSplashWindow*>& StaticMapContainer() { static std::map<HWND,CSplashWindow*> container; return container; } inline static void registerWindow( CSplashWindow* hWnd ) { if( hWnd != NULL ) { StaticMapContainer()[ hWnd->GetWnd() ] = hWnd; } } inline static void unRegisterWindow( CSplashWindow* hWnd ) { if( hWnd != NULL ) { StaticMapContainer().erase( hWnd->GetWnd() ); } } static DWORD WINAPI SplashScreenWorkThread( LPVOID lpParam ) { CSplashWindow* Win = (CSplashWindow*)lpParam; if( Win == NULL || Win->GetIns() == NULL || Win->GetBitmap() == NULL ) { MessageBox( NULL, _T("Error, Can't Create SplashWindow"), _T("Error"), 0 ); return 0; } BITMAP bm; GetObject( Win->GetBitmap(), sizeof(bm), &bm); INT ScreenPosX = (GetSystemMetrics(SM_CXSCREEN) - bm.bmWidth) / 2; INT ScreenPosY = (GetSystemMetrics(SM_CYSCREEN) - bm.bmHeight) / 2; HWND hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, Win->GetClassName().c_str(), TEXT("SplashWindow"), WS_BORDER|WS_POPUP, ScreenPosX, ScreenPosY, bm.bmWidth, bm.bmHeight, (HWND) NULL, (HMENU) NULL, Win->GetIns(), (LPVOID) NULL); Win->SetWnd( hWnd ); registerWindow( Win ); if (hWnd) { ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); MSG message; while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } } return 0; } static LRESULT CALLBACK SplashScreenWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch( message ) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); { try { CSplashWindow* hWindows = StaticMapContainer()[hWnd]; if( hWindows ) { DrawState(hdc, DSS_NORMAL, NULL, (LPARAM)hWindows->GetBitmap(), 0, 0, 0, 0, 0, DST_BITMAP); } } catch(...) { } } EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } }; } int main() { HINSTANCE hInstance = GetModuleHandle(NULL); dbsoft::CSplashWindow splash( hInstance, _T("test.bmp") ); splash.Show(); ::Sleep( 3000 ); splash.Stop(); return 0; } 不要打算用GetWindowLong加参数GWL_HINSTANCE从HWND得到HINSTANCE,我试过了,不行。