static void TestSendMessageTimeout( _In_ HWND hWnd, _In_ UINT Msg) { LRESULT ret; DWORD_PTR result; ret = SendMessageTimeoutW(hWnd, Msg, 0, 0, SMTO_NORMAL, 0, NULL); ok(ret == 0, "ret = %Id\n", ret); result = 0x55555555; ret = SendMessageTimeoutW(hWnd, Msg, 0, 0, SMTO_NORMAL, 0, &result); ok(ret == 0, "ret = %Id\n", ret); ok(result == 0, "result = %Iu\n", result); ret = SendMessageTimeoutA(hWnd, Msg, 0, 0, SMTO_NORMAL, 0, NULL); ok(ret == 0, "ret = %Id\n", ret); result = 0x55555555; ret = SendMessageTimeoutA(hWnd, Msg, 0, 0, SMTO_NORMAL, 0, &result); ok(ret == 0, "ret = %Id\n", ret); ok(result == 0, "result = %Iu\n", result); }
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { HICON hIcon; WCHAR szText[260]; BOOL bLargeIcon; BOOL bHung = FALSE; typedef int (FAR __stdcall *IsHungAppWindowProc)(HWND); IsHungAppWindowProc IsHungAppWindow; /* Skip our window */ if (hWnd == hMainWnd) return TRUE; bLargeIcon = (TaskManagerSettings.ViewMode == ID_VIEW_LARGE); GetWindowTextW(hWnd, szText, 260); /* Get the window text */ /* Check and see if this is a top-level app window */ if ((wcslen(szText) <= 0) || !IsWindowVisible(hWnd) || (GetParent(hWnd) != NULL) || (GetWindow(hWnd, GW_OWNER) != NULL) || (GetWindowLongPtrW(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW)) { return TRUE; /* Skip this window */ } noApps = FALSE; /* Get the icon for this window */ hIcon = NULL; SendMessageTimeoutW(hWnd, WM_GETICON, bLargeIcon ? ICON_BIG : ICON_SMALL, 0, 0, 1000, (PDWORD_PTR)&hIcon); if (!hIcon) { /* We failed, try to retrieve other icons... */ hIcon = (HICON)(LONG_PTR)GetClassLongPtrW(hWnd, bLargeIcon ? GCL_HICON : GCL_HICONSM); if (!hIcon) hIcon = (HICON)(LONG_PTR)GetClassLongPtrW(hWnd, bLargeIcon ? GCL_HICONSM : GCL_HICON); if (!hIcon) SendMessageTimeoutW(hWnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (PDWORD_PTR)&hIcon); if (!hIcon) SendMessageTimeoutW(hWnd, WM_GETICON, bLargeIcon ? ICON_SMALL : ICON_BIG, 0, 0, 1000, (PDWORD_PTR)&hIcon); /* If we still do not have any icon, load the default one */ if (!hIcon) hIcon = LoadIconW(hInst, bLargeIcon ? MAKEINTRESOURCEW(IDI_WINDOW) : MAKEINTRESOURCEW(IDI_WINDOWSM)); } bHung = FALSE; IsHungAppWindow = (IsHungAppWindowProc)(FARPROC)GetProcAddress(GetModuleHandleW(L"USER32.DLL"), "IsHungAppWindow"); if (IsHungAppWindow) bHung = IsHungAppWindow(hWnd); AddOrUpdateHwnd(hWnd, szText, hIcon, bHung); return TRUE; }
static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { HICON hIcon; WCHAR wszText[256]; BOOL bLargeIcon; BOOL bHung = FALSE; typedef int (__stdcall *IsHungAppWindowProc)(HWND); IsHungAppWindowProc IsHungAppWindow; /* Skip our window */ if (hWnd == hMainWnd) return TRUE; bLargeIcon = TaskManagerSettings.View_LargeIcons ? TRUE : FALSE; /* Check and see if this is a top-level app window */ if (!GetWindowTextW(hWnd, wszText, sizeof(wszText)/sizeof(WCHAR)) || !IsWindowVisible(hWnd) || (GetParent(hWnd) != NULL) || (GetWindow(hWnd, GW_OWNER) != NULL) || (GetWindowLongW(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW)) { return TRUE; /* Skip this window */ } /* Get the icon for this window */ hIcon = NULL; SendMessageTimeoutW(hWnd, WM_GETICON, bLargeIcon ? ICON_BIG /*1*/ : ICON_SMALL /*0*/, 0, 0, 1000, (PDWORD_PTR)&hIcon); if (!hIcon) { hIcon = (HICON)GetClassLongPtrW(hWnd, bLargeIcon ? GCLP_HICON : GCLP_HICONSM); if (!hIcon) hIcon = (HICON)GetClassLongPtrW(hWnd, bLargeIcon ? GCLP_HICONSM : GCLP_HICON); if (!hIcon) SendMessageTimeoutW(hWnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (PDWORD_PTR)&hIcon); if (!hIcon) SendMessageTimeoutW(hWnd, WM_GETICON, bLargeIcon ? ICON_SMALL /*0*/ : ICON_BIG /*1*/, 0, 0, 1000, (PDWORD_PTR)&hIcon); } if (!hIcon) hIcon = LoadIconW(hInst, bLargeIcon ? MAKEINTRESOURCEW(IDI_WINDOW) : MAKEINTRESOURCEW(IDI_WINDOWSM)); bHung = FALSE; IsHungAppWindow = (IsHungAppWindowProc)(FARPROC)GetProcAddress(GetModuleHandleW(wszUser32), "IsHungAppWindow"); if (IsHungAppWindow) bHung = IsHungAppWindow(hWnd); AddOrUpdateHwnd(hWnd, wszText, hIcon, bHung); return TRUE; }
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { HICON hIcon; WCHAR szText[260]; BOOL bHung = FALSE; HICON* xhIcon = (HICON*)&hIcon; typedef int (FAR __stdcall *IsHungAppWindowProc)(HWND); IsHungAppWindowProc IsHungAppWindow; /* Skip our window */ if (hWnd == CurrenthWnd) return TRUE; GetWindowTextW(hWnd, szText, 260); /* Get the window text */ /* Check and see if this is a top-level app window */ if ((wcslen(szText) <= 0) || !IsWindowVisible(hWnd) || (GetParent(hWnd) != NULL) || (GetWindow(hWnd, GW_OWNER) != NULL) || (GetWindowLongPtrW(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW)) { return TRUE; /* Skip this window */ } /* Get the icon for this window */ hIcon = NULL; SendMessageTimeoutW(hWnd, WM_GETICON, ICON_SMALL, 0, 0, 1000, (PDWORD_PTR)xhIcon); if (!hIcon) { hIcon = (HICON)(LONG_PTR)GetClassLongPtrW(hWnd, GCL_HICONSM); if (!hIcon) hIcon = (HICON)(LONG_PTR)GetClassLongPtrW(hWnd, GCL_HICON); if (!hIcon) SendMessageTimeoutW(hWnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (PDWORD_PTR)xhIcon); } if (!hIcon) hIcon = LoadIconW(NULL, MAKEINTRESOURCEW(IDI_APPLICATION)); bHung = FALSE; IsHungAppWindow = (IsHungAppWindowProc)(FARPROC)GetProcAddress(GetModuleHandleW(L"USER32.DLL"), "IsHungAppWindow"); if (IsHungAppWindow) bHung = IsHungAppWindow(hWnd); AddOrUpdateHwnd(hWnd, szText, hIcon, bHung); return TRUE; }
/*********************************************************************** * X11DRV_resize_desktop */ void X11DRV_resize_desktop( unsigned int width, unsigned int height ) { HWND hwnd = GetDesktopWindow(); struct desktop_resize_data resize_data; resize_data.old_screen_rect = get_primary_monitor_rect(); resize_data.old_virtual_rect = get_virtual_screen_rect(); xinerama_init( width, height ); resize_data.new_virtual_rect = get_virtual_screen_rect(); if (GetWindowThreadProcessId( hwnd, NULL ) != GetCurrentThreadId()) { SendMessageW( hwnd, WM_X11DRV_RESIZE_DESKTOP, 0, MAKELPARAM( width, height ) ); } else { TRACE( "desktop %p change to (%dx%d)\n", hwnd, width, height ); update_desktop_fullscreen( width, height ); SetWindowPos( hwnd, 0, resize_data.new_virtual_rect.left, resize_data.new_virtual_rect.top, resize_data.new_virtual_rect.right - resize_data.new_virtual_rect.left, resize_data.new_virtual_rect.bottom - resize_data.new_virtual_rect.top, SWP_NOZORDER | SWP_NOACTIVATE | SWP_DEFERERASE ); ungrab_clipping_window(); SendMessageTimeoutW( HWND_BROADCAST, WM_DISPLAYCHANGE, screen_bpp, MAKELPARAM( width, height ), SMTO_ABORTIFHUNG, 2000, NULL ); } EnumWindows( update_windows_on_desktop_resize, (LPARAM)&resize_data ); }
/* send notification about a change to a given drive */ static void send_notify( int drive, int code ) { DWORD_PTR result; DEV_BROADCAST_VOLUME info; info.dbcv_size = sizeof(info); info.dbcv_devicetype = DBT_DEVTYP_VOLUME; info.dbcv_reserved = 0; info.dbcv_unitmask = 1 << drive; info.dbcv_flags = DBTF_MEDIA; SendMessageTimeoutW( HWND_BROADCAST, WM_DEVICECHANGE, code, (LPARAM)&info, SMTO_ABORTIFHUNG, 0, &result ); }
/*********************************************************************** * UserRealizePalette (USER32.@) */ UINT WINAPI UserRealizePalette( HDC hDC ) { UINT realized = pfnGDIRealizePalette( hDC ); /* do not send anything if no colors were changed */ if (realized && GetCurrentObject( hDC, OBJ_PAL ) == hPrimaryPalette) { /* send palette change notification */ HWND hWnd = WindowFromDC( hDC ); if (hWnd) SendMessageTimeoutW( HWND_BROADCAST, WM_PALETTECHANGED, (WPARAM)hWnd, 0, SMTO_ABORTIFHUNG, 2000, NULL ); } return realized; }
//! sets the caption of the window void CIrrDeviceWin32::setWindowCaption(const wchar_t* text) { DWORD dwResult; if (IsNonNTWindows) { const core::stringc s = text; SendMessageTimeout(HWnd, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(s.c_str()), SMTO_ABORTIFHUNG, 2000, &dwResult); } else SendMessageTimeoutW(HWnd, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(text), SMTO_ABORTIFHUNG, 2000, &dwResult); }
void Win32Window::setWindowTitle(const char* titleChar) { wchar_t windowTitle[1024]; swprintf(windowTitle, 1024, L"%hs", titleChar); #ifdef _WIN64 SetWindowTextW(m_data->m_hWnd, windowTitle); #else DWORD dwResult; SendMessageTimeoutW(m_data->m_hWnd, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(windowTitle), SMTO_ABORTIFHUNG, 2000, &dwResult); #endif }
/******************************************************************* * set_active_window */ static BOOL set_active_window( HWND hwnd, HWND *prev, BOOL mouse, BOOL focus ) { HWND previous = GetActiveWindow(); BOOL ret; DWORD old_thread, new_thread; CBTACTIVATESTRUCT cbt; if (previous == hwnd) { if (prev) *prev = hwnd; return TRUE; } /* call CBT hook chain */ cbt.fMouse = mouse; cbt.hWndActive = previous; if (HOOK_CallHooks( WH_CBT, HCBT_ACTIVATE, (WPARAM)hwnd, (LPARAM)&cbt, TRUE )) return FALSE; if (IsWindow(previous)) { SendMessageW( previous, WM_NCACTIVATE, FALSE, (LPARAM)hwnd ); SendMessageW( previous, WM_ACTIVATE, MAKEWPARAM( WA_INACTIVE, IsIconic(previous) ), (LPARAM)hwnd ); } SERVER_START_REQ( set_active_window ) { req->handle = wine_server_user_handle( hwnd ); if ((ret = !wine_server_call_err( req ))) previous = wine_server_ptr_handle( reply->previous ); } SERVER_END_REQ; if (!ret) return FALSE; if (prev) *prev = previous; if (previous == hwnd) return TRUE; if (hwnd) { /* send palette messages */ if (SendMessageW( hwnd, WM_QUERYNEWPALETTE, 0, 0 )) SendMessageTimeoutW( HWND_BROADCAST, WM_PALETTEISCHANGING, (WPARAM)hwnd, 0, SMTO_ABORTIFHUNG, 2000, NULL ); if (!IsWindow(hwnd)) return FALSE; } old_thread = previous ? GetWindowThreadProcessId( previous, NULL ) : 0; new_thread = hwnd ? GetWindowThreadProcessId( hwnd, NULL ) : 0; if (old_thread != new_thread) { HWND *list, *phwnd; if ((list = WIN_ListChildren( GetDesktopWindow() ))) { if (old_thread) { for (phwnd = list; *phwnd; phwnd++) { if (GetWindowThreadProcessId( *phwnd, NULL ) == old_thread) SendMessageW( *phwnd, WM_ACTIVATEAPP, 0, new_thread ); } } if (new_thread) { for (phwnd = list; *phwnd; phwnd++) { if (GetWindowThreadProcessId( *phwnd, NULL ) == new_thread) SendMessageW( *phwnd, WM_ACTIVATEAPP, 1, old_thread ); } } HeapFree( GetProcessHeap(), 0, list ); } } if (IsWindow(hwnd)) { SendMessageW( hwnd, WM_NCACTIVATE, (hwnd == GetForegroundWindow()), (LPARAM)previous ); SendMessageW( hwnd, WM_ACTIVATE, MAKEWPARAM( mouse ? WA_CLICKACTIVE : WA_ACTIVE, IsIconic(hwnd) ), (LPARAM)previous ); if (GetAncestor( hwnd, GA_PARENT ) == GetDesktopWindow()) PostMessageW( GetDesktopWindow(), WM_PARENTNOTIFY, WM_NCACTIVATE, (LPARAM)hwnd ); if (hwnd == GetForegroundWindow() && !IsIconic( hwnd )) USER_Driver->pSetActiveWindow( hwnd ); } /* now change focus if necessary */ if (focus) { GUITHREADINFO info; info.cbSize = sizeof(info); GetGUIThreadInfo( GetCurrentThreadId(), &info ); /* Do not change focus if the window is no more active */ if (hwnd == info.hwndActive) { if (!info.hwndFocus || !hwnd || GetAncestor( info.hwndFocus, GA_ROOT ) != hwnd) set_focus_window( hwnd ); } } return TRUE; }
void Win32OpenGLWindow::init(int width,int height, bool fullscreen,int colorBitsPerPixel, void* windowHandle) { // get handle to exe file HINSTANCE hInstance = GetModuleHandle(0); // create the window if we need to and we do not use the null device if (!windowHandle) { const char* ClassName = "DeviceWin32"; // Register Class WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon( NULL, IDI_APPLICATION ); //(HICON)LoadImage(hInstance, "bullet_ico.ico", IMAGE_ICON, 0,0, LR_LOADTRANSPARENT);//LR_LOADFROMFILE); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = 0; wcex.lpszClassName = ClassName; wcex.hIconSm = 0; // if there is an icon, load it wcex.hIcon = (HICON)LoadImage(hInstance, "irrlicht.ico", IMAGE_ICON, 0,0, LR_LOADFROMFILE); RegisterClassEx(&wcex); // calculate client size RECT clientSize; clientSize.top = 0; clientSize.left = 0; clientSize.right = width; clientSize.bottom = height; DWORD style = WS_POPUP; if (!fullscreen) style = WS_SYSMENU | WS_BORDER | WS_CAPTION | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SIZEBOX; AdjustWindowRect(&clientSize, style, FALSE); m_data->m_width = clientSize.right - clientSize.left; m_data->m_height = clientSize.bottom - clientSize.top; int windowLeft = (GetSystemMetrics(SM_CXSCREEN) - m_data->m_width) / 2; int windowTop = (GetSystemMetrics(SM_CYSCREEN) - m_data->m_height) / 2; if (fullscreen) { windowLeft = 0; windowTop = 0; } // create window m_data->m_hWnd = CreateWindow( ClassName, "", style, windowLeft, windowTop, m_data->m_width, m_data->m_height, NULL, NULL, hInstance, NULL); ShowWindow(m_data->m_hWnd, SW_SHOW); UpdateWindow(m_data->m_hWnd); MoveWindow(m_data->m_hWnd, windowLeft, windowTop, m_data->m_width, m_data->m_height, TRUE); } else if (windowHandle) { // attach external window m_data->m_hWnd = static_cast<HWND>(windowHandle); RECT r; GetWindowRect(m_data->m_hWnd, &r); m_data->m_width = r.right - r.left; m_data->m_height = r.bottom - r.top; //sFullScreen = false; //sExternalWindow = true; } if (fullscreen) { DEVMODE dm; memset(&dm, 0, sizeof(dm)); dm.dmSize = sizeof(dm); // use default values from current setting EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm); m_data->m_oldScreenWidth = dm.dmPelsWidth; m_data->m_oldHeight = dm.dmPelsHeight; m_data->m_oldBitsPerPel = dm.dmBitsPerPel; dm.dmPelsWidth = width; dm.dmPelsHeight = height; if (colorBitsPerPixel) { dm.dmBitsPerPel = colorBitsPerPixel; } dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY; LONG res = ChangeDisplaySettings(&dm, CDS_FULLSCREEN); if (res != DISP_CHANGE_SUCCESSFUL) { // try again without forcing display frequency dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; res = ChangeDisplaySettings(&dm, CDS_FULLSCREEN); } } //VideoDriver = video::createOpenGLDriver(CreationParams, FileSystem, this); enableOpenGL(); const wchar_t* text= L"OpenCL rigid body demo"; DWORD dwResult; #ifdef _WIN64 SetWindowTextW(m_data->m_hWnd, text); #else SendMessageTimeoutW(m_data->m_hWnd, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(text), SMTO_ABORTIFHUNG, 2000, &dwResult); #endif }
//------------------------------------------------------------------------------------------------- static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { //Skype begin static UINT iIdSkypeControlApiAttach; static constexpr const LPARAM iSkypeControlApiAttachSuccess = 0; static COLORREF colRef = RGB(255, 127, 0); static bool bNeedSkype = true; //Skype end static HFONT hFont; static bool bTimerActive = false; static const wchar_t *wSoundCardName; switch (uMsg) { case WM_CREATE: { if ((hFont = CreateFontW(48, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH, L"Tahoma")) && SetLayeredWindowAttributes(hWnd, 0, 0, LWA_COLORKEY) && //Skype begin ((iIdSkypeControlApiAttach = RegisterWindowMessageW(L"SkypeControlAPIAttach")))) if (const UINT iCount = RegisterWindowMessageW(L"SkypeControlAPIDiscover")) if (PostMessageW(HWND_BROADCAST, iCount, reinterpret_cast<WPARAM>(hWnd), 0) && //Skype end SetTimer(hWnd, 1, 1500, nullptr)) { bTimerActive = true; wSoundCardName = static_cast<wchar_t*>(reinterpret_cast<const CREATESTRUCT*>(lParam)->lpCreateParams); return 0; } return -1; } case WM_PAINT: { PAINTSTRUCT ps; if (const HDC hDc = BeginPaint(hWnd, &ps)) { RECT rect; if (GetClientRect(hWnd, &rect)) { rect.top = 40; SelectObject(hDc, hFont); SetBkColor(hDc, RGB(1, 1, 1)); SetTextColor(hDc, colRef); //Skype DrawTextW(hDc, wSoundCardName, -1, &rect, DT_CENTER); } EndPaint(hWnd, &ps); } return 0; } //Skype begin case WM_COPYDATA: if (bNeedSkype) { const COPYDATASTRUCT *const copyData = reinterpret_cast<const COPYDATASTRUCT*>(lParam); if (copyData->dwData == 0 && copyData->cbData > 10 && strncmp(static_cast<const char*>(copyData->lpData), "AUDIO_OUT ", 10) == 0) { colRef = RGB(255, 255, 0); InvalidateRect(hWnd, nullptr, FALSE); bNeedSkype = false; } } return TRUE; //Skype end case WM_TIMER: { KillTimer(hWnd, 1); bTimerActive = false; PostMessageW(hWnd, WM_CLOSE, 0, 0); return 0; } case WM_DESTROY: { if (bTimerActive) KillTimer(hWnd, 1); if (hFont) DeleteObject(hFont); PostQuitMessage(0); return 0; } } //Skype begin if (uMsg == iIdSkypeControlApiAttach) { if (lParam == iSkypeControlApiAttachSuccess) { const wchar_t *wIt = wSoundCardName; while (*wIt++); int iLen = wIt-wSoundCardName-1; if (iLen <= 256) { char cBuf[14+256*sizeof(wchar_t)] = "SET AUDIO_OUT "; if (const int iSize = WideCharToMultiByte(CP_UTF8, 0, wSoundCardName, -1, cBuf+14, iLen*sizeof(wchar_t), nullptr, nullptr)) { COPYDATASTRUCT copyData; copyData.dwData = 0; copyData.cbData = 14 + iSize; copyData.lpData = cBuf; SendMessageTimeoutW(reinterpret_cast<HWND>(wParam), WM_COPYDATA, reinterpret_cast<WPARAM>(hWnd), reinterpret_cast<LPARAM>(©Data), SMTO_ABORTIFHUNG, 0, nullptr); } } } return 0; } //Skype end return DefWindowProcW(hWnd, uMsg, wParam, lParam); }
/***************************************************************** * DdeConnect (USER32.@) */ HCONV WINAPI DdeConnect(DWORD idInst, HSZ hszService, HSZ hszTopic, PCONVCONTEXT pCC) { HWND hwndClient; WDML_INSTANCE* pInstance; WDML_CONV* pConv; ATOM aSrv = 0, aTpc = 0; TRACE("(0x%x,%p,%p,%p)\n", idInst, hszService, hszTopic, pCC); pInstance = WDML_GetInstance(idInst); if (!pInstance) return NULL; /* make sure this conv is never created */ pConv = WDML_FindConv(pInstance, WDML_CLIENT_SIDE, hszService, hszTopic); if (pConv != NULL) { ERR("This Conv already exists: (%p)\n", pConv); return NULL; } /* we need to establish a conversation with server, so create a window for it */ if (pInstance->unicode) { WNDCLASSEXW wndclass; wndclass.cbSize = sizeof(wndclass); wndclass.style = 0; wndclass.lpfnWndProc = WDML_ClientProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 2 * sizeof(ULONG_PTR); wndclass.hInstance = 0; wndclass.hIcon = 0; wndclass.hCursor = 0; wndclass.hbrBackground = 0; wndclass.lpszMenuName = NULL; wndclass.lpszClassName = WDML_szClientConvClassW; wndclass.hIconSm = 0; RegisterClassExW(&wndclass); hwndClient = CreateWindowW(WDML_szClientConvClassW, NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, 0); } else { WNDCLASSEXA wndclass; wndclass.cbSize = sizeof(wndclass); wndclass.style = 0; wndclass.lpfnWndProc = WDML_ClientProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 2 * sizeof(ULONG_PTR); wndclass.hInstance = 0; wndclass.hIcon = 0; wndclass.hCursor = 0; wndclass.hbrBackground = 0; wndclass.lpszMenuName = NULL; wndclass.lpszClassName = WDML_szClientConvClassA; wndclass.hIconSm = 0; RegisterClassExA(&wndclass); hwndClient = CreateWindowA(WDML_szClientConvClassA, NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, 0); } SetWindowLongPtrW(hwndClient, GWL_WDML_INSTANCE, (ULONG_PTR)pInstance); if (hszService) { aSrv = WDML_MakeAtomFromHsz(hszService); if (!aSrv) goto theEnd; } if (hszTopic) { aTpc = WDML_MakeAtomFromHsz(hszTopic); if (!aTpc) goto theEnd; } /* note: sent messages shall not use packing */ SendMessageTimeoutW( HWND_BROADCAST, WM_DDE_INITIATE, (WPARAM)hwndClient, MAKELPARAM(aSrv, aTpc), SMTO_ABORTIFHUNG, 0, NULL ); pInstance = WDML_GetInstance(idInst); if (!pInstance) { goto theEnd; } /* At this point, Client WM_DDE_ACK should have saved hwndServer for this instance id and hwndClient if server responds. So get HCONV and return it. And add it to conv list */ pConv = WDML_GetConvFromWnd(hwndClient); if (pConv == NULL || pConv->hwndServer == 0) { WARN("Done with INITIATE, but no Server window available\n"); pConv = NULL; pInstance->lastError = DMLERR_NO_CONV_ESTABLISHED; goto theEnd; } TRACE("Connected to Server window (%p)\n", pConv->hwndServer); pConv->wConvst = XST_CONNECTED; /* finish init of pConv */ if (pCC != NULL) { pConv->convContext = *pCC; } else { memset(&pConv->convContext, 0, sizeof(pConv->convContext)); pConv->convContext.cb = sizeof(pConv->convContext); pConv->convContext.iCodePage = (pInstance->unicode) ? CP_WINUNICODE : CP_WINANSI; } theEnd: if (aSrv) GlobalDeleteAtom(aSrv); if (aTpc) GlobalDeleteAtom(aTpc); return (HCONV)pConv; }