HWND WINAPI OnCreateWindowExW(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam) { //typedef HWND (WINAPI* OnCreateWindowExW_t)(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); ORIGINAL_EX(CreateWindowExW); HWND hWnd = NULL; BOOL bAttachGui = FALSE, bStyleHidden = FALSE; DWORD lStyle = dwStyle, lStyleEx = dwExStyle; if (CheckCanCreateWindow(NULL, lpClassName, dwStyle, dwExStyle, hWndParent, bAttachGui, bStyleHidden) && F(CreateWindowExW) != NULL) { if (bAttachGui) { x = grcConEmuClient.left; y = grcConEmuClient.top; nWidth = grcConEmuClient.right - grcConEmuClient.left; nHeight = grcConEmuClient.bottom - grcConEmuClient.top; } hWnd = F(CreateWindowExW)(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); DWORD dwErr = GetLastError(); if (hWnd && bAttachGui) { OnGuiWindowAttached(hWnd, hMenu, NULL, lpClassName, lStyle, lStyleEx, bStyleHidden); SetLastError(dwErr); } } _ASSERTRESULT(hWnd!=NULL); return hWnd; }
HWND WINAPI OnCreateDialogParamW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) { //typedef HWND (WINAPI* OnCreateDialogParamW_t)(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam); ORIGINALFASTEX(CreateDialogParamW,NULL); HWND hWnd = NULL; BOOL bAttachGui = FALSE, bStyleHidden = FALSE; LPCDLGTEMPLATE lpTemplate = NULL; DWORD lStyle = 0; //lpTemplate ? lpTemplate->style : 0; DWORD lStyleEx = 0; //lpTemplate ? lpTemplate->dwExtendedStyle : 0; // Загрузить ресурс диалога, и глянуть его параметры lStyle/lStyleEx HRSRC hDlgSrc = FindResourceW(hInstance, lpTemplateName, RT_DIALOG); if (hDlgSrc) { HGLOBAL hDlgHnd = LoadResource(hInstance, hDlgSrc); if (hDlgHnd) { lpTemplate = (LPCDLGTEMPLATE)LockResource(hDlgHnd); if (lpTemplate) { lStyle = lpTemplate ? lpTemplate->style : 0; lStyleEx = lpTemplate ? lpTemplate->dwExtendedStyle : 0; } } } if ((!lpTemplate || CheckCanCreateWindow(NULL, (LPWSTR)32770, lStyle, lStyleEx, hWndParent, bAttachGui, bStyleHidden)) && F(CreateDialogParamW) != NULL) { //if (bAttachGui) //{ // x = grcConEmuClient.left; y = grcConEmuClient.top; // nWidth = grcConEmuClient.right - grcConEmuClient.left; nHeight = grcConEmuClient.bottom - grcConEmuClient.top; //} hWnd = F(CreateDialogParamW)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam); DWORD dwErr = GetLastError(); if (hWnd && bAttachGui) { OnGuiWindowAttached(hWnd, NULL, NULL, (LPCWSTR)32770, lStyle, lStyleEx, bStyleHidden); SetLastError(dwErr); } } return hWnd; }
HWND WINAPI OnCreateDialogIndirectParamA(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit) { //typedef HWND (WINAPI* OnCreateDialogIndirectParamA_t)(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit); ORIGINALFASTEX(CreateDialogIndirectParamA,NULL); HWND hWnd = NULL; BOOL bAttachGui = (hWndParent == NULL), bStyleHidden = FALSE; // Со стилями - полная фигня сюда попадает DWORD lStyle = lpTemplate ? lpTemplate->style : 0; DWORD lStyleEx = lpTemplate ? lpTemplate->dwExtendedStyle : 0; if (/*CheckCanCreateWindow((LPCSTR)32770, NULL, lStyle, lStyleEx, hWndParent, bAttachGui, bStyleHidden) &&*/ F(CreateDialogIndirectParamA) != NULL) { //if (bAttachGui) //{ // x = grcConEmuClient.left; y = grcConEmuClient.top; // nWidth = grcConEmuClient.right - grcConEmuClient.left; nHeight = grcConEmuClient.bottom - grcConEmuClient.top; //} hWnd = F(CreateDialogIndirectParamA)(hInstance, lpTemplate, hWndParent, lpDialogFunc, lParamInit); DWORD dwErr = GetLastError(); if (hWnd && bAttachGui) { lStyle = (DWORD)GetWindowLongPtr(hWnd, GWL_STYLE); lStyleEx = (DWORD)GetWindowLongPtr(hWnd, GWL_EXSTYLE); if (CheckCanCreateWindow((LPCSTR)32770, NULL, lStyle, lStyleEx, hWndParent, bAttachGui, bStyleHidden) && bAttachGui) { OnGuiWindowAttached(hWnd, NULL, (LPCSTR)32770, NULL, lStyle, lStyleEx, bStyleHidden); } SetLastError(dwErr); } } return hWnd; }
void OnShowGuiClientWindow(HWND hWnd, int &nCmdShow, BOOL &rbGuiAttach, BOOL &rbInactive) { #ifdef _DEBUG STARTUPINFO si = {sizeof(si)}; GetStartupInfo(&si); #endif rbInactive = FALSE; //if (ghConEmuWnd) //{ // DWORD nConEmuExStyle = user->getWindowLongPtrW(ghConEmuWnd, GWL_EXSTYLE); // if (nConEmuExStyle & WS_EX_TOPMOST) // { // DWORD nExtStyle = user->getWindowLongPtrW(hWnd, GWL_EXSTYLE); // if (!(nExtStyle & WS_EX_TOPMOST)) // { // nExtStyle |= WS_EX_TOPMOST; // user->setWindowLongPtrW(hWnd, GWL_EXSTYLE, nExtStyle); // } // } //} if ((!ghAttachGuiClient) && gbAttachGuiClient && (nCmdShow >= SW_SHOWNORMAL)) { // VLC создает несколько "подходящих" окон, но ShowWindow зовет // только для одного из них. Поэтому фактический аттач делаем // только в том случае, если окно "видимое" HMENU hMenu = user->getMenu(hWnd); wchar_t szClassName[255]; user->getClassNameW(hWnd, szClassName, countof(szClassName)); DWORD nCurStyle = (DWORD)user->getWindowLongPtrW(hWnd, GWL_STYLE); DWORD nCurStyleEx = (DWORD)user->getWindowLongPtrW(hWnd, GWL_EXSTYLE); BOOL bAttachGui = TRUE; if (ghAttachGuiClient == NULL) { HWND hWndParent = ::GetParent(hWnd); DWORD dwStyle = nCurStyle, dwExStyle = nCurStyleEx; BOOL bStyleHidden; CheckCanCreateWindow(NULL, szClassName, dwStyle, dwExStyle, hWndParent, bAttachGui, bStyleHidden); } // Пробуем if (bAttachGui) { OnGuiWindowAttached(hWnd, hMenu, NULL, szClassName, nCurStyle, nCurStyleEx, FALSE, nCmdShow); } } if (gbForceShowGuiClient && (ghAttachGuiClient == hWnd)) { //if (nCmdShow == SW_HIDE) // nCmdShow = SW_SHOWNORMAL; HWND hCurParent = user->getParent(hWnd); if (hCurParent != ghConEmuWndBack) { DWORD nCurStyle = (DWORD)user->getWindowLongPtrW(hWnd, GWL_STYLE); DWORD nCurStyleEx = (DWORD)user->getWindowLongPtrW(hWnd, GWL_EXSTYLE); DWORD nSize = sizeof(CESERVER_REQ_HDR)+sizeof(CESERVER_REQ_ATTACHGUIAPP); CESERVER_REQ *pIn = ExecuteNewCmd(CECMD_ATTACHGUIAPP, nSize); pIn->AttachGuiApp.nFlags = gnAttachGuiClientFlags; pIn->AttachGuiApp.nPID = GetCurrentProcessId(); pIn->AttachGuiApp.hAppWindow = hWnd; pIn->AttachGuiApp.Styles.nStyle = nCurStyle; // стили могли измениться после создания окна, pIn->AttachGuiApp.Styles.nStyleEx = nCurStyleEx; // поэтому получим актуальные user->getWindowRect(hWnd, &pIn->AttachGuiApp.rcWindow); GetModuleFileName(NULL, pIn->AttachGuiApp.sAppFilePathName, countof(pIn->AttachGuiApp.sAppFilePathName)); wchar_t szGuiPipeName[128]; msprintf(szGuiPipeName, countof(szGuiPipeName), CEGUIPIPENAME, L".", (DWORD)ghConEmuWnd); CESERVER_REQ* pOut = ExecuteCmd(szGuiPipeName, pIn, 0/*Default timeout*/, NULL); ExecuteFreeResult(pIn); if (pOut) { if (pOut->hdr.cbSize > sizeof(CESERVER_REQ_HDR) && (pOut->AttachGuiApp.nFlags & agaf_Success)) { //grcAttachGuiClientPos = pOut->AttachGuiApp.rcWindow; _ASSERTE((ghConEmuWndBack==NULL) || (pOut->AttachGuiApp.hConEmuBack==ghConEmuWndBack)); _ASSERTE(ghConEmuWnd && (ghConEmuWnd==pOut->AttachGuiApp.hConEmuWnd)); ghConEmuWnd = pOut->AttachGuiApp.hConEmuWnd; SetConEmuHkWindows(pOut->AttachGuiApp.hConEmuDc, pOut->AttachGuiApp.hConEmuBack); //gbGuiClientHideCaption = pOut->AttachGuiApp.bHideCaption; gGuiClientStyles = pOut->AttachGuiApp.Styles; //Если приложение создается в НЕ активной вкладке - фокус нужно вернуть в ConEmu rbInactive = (pOut->AttachGuiApp.nFlags & agaf_Inactive) == agaf_Inactive; } ExecuteFreeResult(pOut); } //OnSetParent(hWnd, ghConEmuWndBack); } ReplaceGuiAppWindow(FALSE); //RECT rcGui = grcAttachGuiClientPos; //user->setWindowPos(hWnd, HWND_TOP, rcGui.left,rcGui.top, rcGui.right-rcGui.left, rcGui.bottom-rcGui.top, // SWP_FRAMECHANGED); nCmdShow = SW_SHOWNORMAL; gbForceShowGuiClient = FALSE; // Один раз? rbGuiAttach = TRUE; } }