BOOL WINAPI OnGetWindowRect(HWND hWnd, LPRECT lpRect) { //typedef BOOL (WINAPI* OnGetWindowRect_t)(HWND hWnd, LPRECT lpRect); ORIGINAL_EX(GetWindowRect); BOOL lbRc = FALSE; if ((hWnd == ghConWnd) && ghConEmuWndDC) { //EMenu gui mode issues (center in window). "Remove" Far window from mouse cursor. hWnd = ghConEmuWndDC; } if (F(GetWindowRect) != NULL) lbRc = F(GetWindowRect)(hWnd, lpRect); //if (ghConEmuWndDC && lpRect) //{ // //EMenu text mode issues. "Remove" Far window from mouse cursor. // POINT ptCur = {0}; // GetCursorPos(&ptCur); // lpRect->left += ptCur.x; // lpRect->right += ptCur.x; // lpRect->top += ptCur.y; // lpRect->bottom += ptCur.y; //} _ASSERTRESULT(lbRc); return lbRc; }
// Issue 1125: Hook undocumented function used for running commands typed in Windows 7 Win-menu search string. HRESULT WINAPI OnShellExecCmdLine(HWND hwnd, LPCWSTR pwszCommand, LPCWSTR pwszStartDir, int nShow, LPVOID pUnused, DWORD dwSeclFlags) { //typedef HRESULT (WINAPI* OnShellExecCmdLine_t)(HWND hwnd, LPCWSTR pwszCommand, LPCWSTR pwszStartDir, int nShow, LPVOID pUnused, DWORD dwSeclFlags); ORIGINAL_EX(ShellExecCmdLine); HRESULT hr = S_OK; // This is used from "Run" dialog too. We need to process command internally, because // otherwise Win can pass CREATE_SUSPENDED into CreateProcessW, so console will flickers. // From Win7 start menu: "cmd" and Ctrl+Shift+Enter - dwSeclFlags==0x79 if (nShow && pwszCommand && pwszStartDir) { if (!IsBadStringPtrW(pwszCommand, MAX_PATH) && !IsBadStringPtrW(pwszStartDir, MAX_PATH)) { hr = OurShellExecCmdLine(hwnd, pwszCommand, pwszStartDir, (dwSeclFlags & 0x40)==0x40, false); if (hr == (HRESULT)-1) goto ApiCall; else goto wrap; } } ApiCall: if (!F(ShellExecCmdLine)) { hr = HRESULT_FROM_WIN32(ERROR_INVALID_FUNCTION); } else { hr = F(ShellExecCmdLine)(hwnd, pwszCommand, pwszStartDir, nShow, pUnused, dwSeclFlags); } wrap: return hr; }
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; }
BOOL WINAPI OnSetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl) { //typedef BOOL (WINAPI* OnSetWindowPlacement_t)(HWND hWnd, WINDOWPLACEMENT *lpwndpl); ORIGINAL_EX(SetWindowPlacement); BOOL lbRc = FALSE; WINDOWPLACEMENT wpl = {sizeof(wpl)}; if (ghConEmuWndDC && (hWnd == ghConEmuWndDC || hWnd == ghConEmuWnd)) return TRUE; // обманем. приложениям запрещено "двигать" ConEmuDC if (lpwndpl && ghConEmuWndDC && ghAttachGuiClient && !gbGuiClientExternMode && hWnd == ghAttachGuiClient) { // GUI приложениями запрещено самостоятельно двигаться внутри ConEmu int X, Y, cx, cy; if (OnSetGuiClientWindowPos(hWnd, NULL, X, Y, cx, cy, 0)) { wpl.showCmd = SW_RESTORE; wpl.rcNormalPosition.left = X; wpl.rcNormalPosition.top = Y; wpl.rcNormalPosition.right = X + cx; wpl.rcNormalPosition.bottom = Y + cy; wpl.ptMinPosition = lpwndpl->ptMinPosition; wpl.ptMaxPosition = lpwndpl->ptMaxPosition; lpwndpl = &wpl; } } if (F(SetWindowPlacement)) lbRc = F(SetWindowPlacement)(hWnd, lpwndpl); return lbRc; }
int WINAPI OnStretchDIBits(HDC hdc, int XDest, int YDest, int nDestWidth, int nDestHeight, int XSrc, int YSrc, int nSrcWidth, int nSrcHeight, const VOID *lpBits, const BITMAPINFO *lpBitsInfo, UINT iUsage, DWORD dwRop) { //typedef int (WINAPI* OnStretchDIBits_t)(HDC hdc, int XDest, int YDest, int nDestWidth, int nDestHeight, int XSrc, int YSrc, int nSrcWidth, int nSrcHeight, const VOID *lpBits, const BITMAPINFO *lpBitsInfo, UINT iUsage, DWORD dwRop); ORIGINAL_EX(StretchDIBits); int iRc = 0; if (F(StretchDIBits)) iRc = F(StretchDIBits)(hdc, XDest, YDest, nDestWidth, nDestHeight, XSrc, YSrc, nSrcWidth, nSrcHeight, lpBits, lpBitsInfo, iUsage, dwRop); // Если рисуют _прямо_ на канвасе ConEmu if (iRc != (int)GDI_ERROR && hdc && hdc == ghTempHDC) { // Уведомить GUI, что у него прямо на канвасе кто-то что-то нарисовал :) CESERVER_REQ* pIn = ExecuteNewCmd(CECMD_LOCKDC, sizeof(CESERVER_REQ_HDR)+sizeof(CESERVER_REQ_LOCKDC)); if (pIn) { pIn->LockDc.hDcWnd = ghConEmuWndDC; // На всякий случай pIn->LockDc.bLock = TRUE; pIn->LockDc.Rect.left = XDest; pIn->LockDc.Rect.top = YDest; pIn->LockDc.Rect.right = XDest+nDestWidth-1; pIn->LockDc.Rect.bottom = YDest+nDestHeight-1; CESERVER_REQ* pOut = ExecuteGuiCmd(ghConWnd, pIn, ghConWnd); if (pOut) ExecuteFreeResult(pOut); ExecuteFreeResult(pIn); } } return iRc; }
BOOL WINAPI OnSetForegroundWindow(HWND hWnd) { //typedef BOOL (WINAPI* OnSetForegroundWindow_t)(HWND hWnd); ORIGINAL_EX(SetForegroundWindow); BOOL lbRc = FALSE; if (ghConEmuWndDC) { if (hWnd == ghConEmuWndDC) hWnd = ghConEmuWnd; lbRc = GuiSetForeground(hWnd); } // ConEmu наверное уже все сделал, но на всякий случай, дернем и здесь if (F(SetForegroundWindow) != NULL) { lbRc = F(SetForegroundWindow)(hWnd); //if (gbShowOnSetForeground && lbRc) //{ // if (IsWindow(hWnd) && !IsWindowVisible(hWnd)) // ShowWindow(hWnd, SW_SHOW); //} } return lbRc; }
BOOL WINAPI OnSetMenu(HWND hWnd, HMENU hMenu) { //typedef BOOL (WINAPI* OnSetMenu_t)(HWND hWnd, HMENU hMenu); ORIGINAL_EX(SetMenu); BOOL lbRc = FALSE; if (hMenu && ghAttachGuiClient && hWnd == ghAttachGuiClient) { if ((gnAttachGuiClientFlags & (agaf_WS_CHILD|agaf_NoMenu|agaf_DotNet)) == (agaf_WS_CHILD|agaf_NoMenu)) { gnAttachGuiClientFlags &= ~(agaf_WS_CHILD|agaf_NoMenu); DWORD_PTR dwStyle = GetWindowLongPtr(ghAttachGuiClient, GWL_STYLE); DWORD_PTR dwNewStyle = (dwStyle & ~WS_CHILD) | (gnAttachGuiClientStyle & WS_POPUP); if (dwStyle != dwNewStyle) { SetWindowLongPtr(ghAttachGuiClient, GWL_STYLE, dwNewStyle); } } } if (F(SetMenu) != NULL) { lbRc = F(SetMenu)(hWnd, hMenu); } return lbRc; }
BOOL WINAPI OnBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop) { //typedef int (WINAPI* OnBitBlt_t)(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop); ORIGINAL_EX(BitBlt); BOOL bRc = FALSE; if (F(BitBlt)) bRc = F(BitBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop); // Если рисуют _прямо_ на канвасе ConEmu if (bRc && hdcDest && hdcDest == ghTempHDC) { // Уведомить GUI, что у него прямо на канвасе кто-то что-то нарисовал :) CESERVER_REQ* pIn = ExecuteNewCmd(CECMD_LOCKDC, sizeof(CESERVER_REQ_HDR)+sizeof(CESERVER_REQ_LOCKDC)); if (pIn) { pIn->LockDc.hDcWnd = ghConEmuWndDC; // На всякий случай pIn->LockDc.bLock = TRUE; pIn->LockDc.Rect.left = nXDest; pIn->LockDc.Rect.top = nYDest; pIn->LockDc.Rect.right = nXDest+nWidth-1; pIn->LockDc.Rect.bottom = nYDest+nHeight-1; CESERVER_REQ* pOut = ExecuteGuiCmd(ghConWnd, pIn, ghConWnd); if (pOut) ExecuteFreeResult(pOut); ExecuteFreeResult(pIn); } } return bRc; }
BOOL WINAPI OnShellExecuteExW(LPSHELLEXECUTEINFOW lpExecInfo) { //typedef BOOL (WINAPI* OnShellExecuteExW_t)(LPSHELLEXECUTEINFOW lpExecInfo); ORIGINAL_EX(ShellExecuteExW); if (!F(ShellExecuteExW)) { SetLastError(ERROR_INVALID_FUNCTION); return FALSE; } CShellProc* sp = new CShellProc(); if (!sp || !sp->OnShellExecuteExW(&lpExecInfo)) { delete sp; SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } BOOL lbRc = FALSE; lbRc = F(ShellExecuteExW)(lpExecInfo); DWORD dwErr = GetLastError(); sp->OnShellFinished(lbRc, lpExecInfo->hInstApp, lpExecInfo->hProcess); delete sp; SetLastError(dwErr); return lbRc; }
HWND WINAPI OnGetWindow(HWND hWnd, UINT uCmd) { //typedef HWND (WINAPI* OnGetWindow_t)(HWND hWnd, UINT uCmd); ORIGINAL_EX(GetWindow); HWND lhRc = NULL; if (ghConEmuWndDC) { if (ghAttachGuiClient) { if ((hWnd == ghAttachGuiClient || hWnd == ghConEmuWndDC) && (uCmd == GW_OWNER)) { hWnd = ghConEmuWnd; } } else if ((hWnd == ghConEmuWndDC) && (uCmd == GW_OWNER)) { hWnd = ghConEmuWnd; } } if (F(GetWindow)) { lhRc = F(GetWindow)(hWnd, uCmd); if (ghAttachGuiClient && (uCmd == GW_OWNER) && (lhRc == ghConEmuWndDC)) { _ASSERTE(lhRc != ghConEmuWndDC); lhRc = ghAttachGuiClient; } } _ASSERTRESULT(lhRc!=NULL); return lhRc; }
HWND WINAPI OnGetParent(HWND hWnd) { //typedef HWND (WINAPI* OnGetParent_t)(HWND hWnd); ORIGINAL_EX(GetParent); HWND lhRc = NULL; //if (ghConEmuWndDC && hWnd == ghConEmuWndDC) //{ // hWnd = ghConEmuWnd; //} if (ghConEmuWndDC) { if (ghAttachGuiClient) { if (hWnd == ghAttachGuiClient || hWnd == ghConEmuWndDC) { // Обмануть GUI-клиента, пусть он думает, что он "сверху" hWnd = ghConEmuWnd; } } else if (hWnd == ghConEmuWndDC) { hWnd = ghConEmuWnd; } } if (F(GetParent)) { lhRc = F(GetParent)(hWnd); } return lhRc; }
HWND WINAPI OnSetParent(HWND hWndChild, HWND hWndNewParent) { //typedef HWND (WINAPI* OnSetParent_t)(HWND hWndChild, HWND hWndNewParent); ORIGINAL_EX(SetParent); HWND lhRc = NULL; if (ghConEmuWndDC && hWndChild == ghConEmuWndDC) { _ASSERTE(hWndChild != ghConEmuWndDC); return NULL; // обманем } if (hWndNewParent && ghConEmuWndDC) { _ASSERTE(hWndNewParent!=ghConEmuWnd); //hWndNewParent = ghConEmuWndDC; } if (F(SetParent)) { lhRc = F(SetParent)(hWndChild, hWndNewParent); } return lhRc; }
VOID WINAPI Onmouse_event(DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, ULONG_PTR dwExtraInfo) { //typedef VOID (WINAPI* Onmouse_event_t)(DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, ULONG_PTR dwExtraInfo); ORIGINAL_EX(mouse_event); F(mouse_event)(dwFlags, dx, dy, dwData, dwExtraInfo); }
UINT WINAPI OnSendInput(UINT nInputs, LPINPUT pInputs, int cbSize) { //typedef UINT (WINAPI* OnSendInput_t)(UINT nInputs, LPINPUT pInputs, int cbSize); ORIGINAL_EX(SendInput); UINT nRc; nRc = F(SendInput)(nInputs, pInputs, cbSize); return nRc; }
BOOL WINAPI OnStretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop) { //typedef int (WINAPI* OnStretchBlt_t)(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop); ORIGINAL_EX(StretchBlt); BOOL bRc = FALSE; //#ifdef _DEBUG //HWND h = WindowFromDC(hdcDest); //#endif // Если рисуют _прямо_ на канвасе ConEmu if (/*bRc &&*/ hdcDest && hdcDest == ghTempHDC) { if ( (!StretchBltBatch.bottom && !StretchBltBatch.top) || (nYOriginDest <= StretchBltBatch.top) || (nXOriginDest != StretchBltBatch.left) || (StretchBltBatch.right != (nXOriginDest+nWidthDest-1)) || (StretchBltBatch.bottom != (nYOriginDest-1)) ) { // Сброс батча StretchBltBatch.left = nXOriginDest; StretchBltBatch.top = nYOriginDest; StretchBltBatch.right = nXOriginDest+nWidthDest-1; StretchBltBatch.bottom = nYOriginDest+nHeightDest-1; } else { StretchBltBatch.bottom = nYOriginDest+nHeightDest-1; } // Уведомить GUI, что у него прямо на канвасе кто-то что-то нарисовал :) CESERVER_REQ* pIn = ExecuteNewCmd(CECMD_LOCKDC, sizeof(CESERVER_REQ_HDR)+sizeof(CESERVER_REQ_LOCKDC)); if (pIn) { pIn->LockDc.hDcWnd = ghConEmuWndDC; // На всякий случай pIn->LockDc.bLock = TRUE; pIn->LockDc.Rect = StretchBltBatch; CESERVER_REQ* pOut = ExecuteGuiCmd(ghConWnd, pIn, ghConWnd); if (pOut) ExecuteFreeResult(pOut); ExecuteFreeResult(pIn); } } if (F(StretchBlt)) bRc = F(StretchBlt)(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, dwRop); return bRc; }
int WINAPI OnGetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount) { //typedef int (WINAPI* OnGetWindowTextA_t)(HWND hWnd, LPSTR lpString, int nMaxCount); ORIGINAL_EX(GetWindowTextA); int iRc = 0; FixHwnd4ConText(hWnd); if (F(GetWindowTextA)) iRc = F(GetWindowTextA)(hWnd, lpString, nMaxCount); return iRc; }
int WINAPI OnGetWindowTextLengthW(HWND hWnd) { //typedef int (WINAPI* OnGetWindowTextLengthW_t)(HWND hWnd); ORIGINAL_EX(GetWindowTextLengthW); int iRc = 0; FixHwnd4ConText(hWnd); if (F(GetWindowTextLengthW)) iRc = F(GetWindowTextLengthW)(hWnd); return iRc; }
BOOL WINAPI OnPeekMessageW(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { //typedef BOOL (WINAPI* OnPeekMessageW_t)(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); ORIGINAL_EX(PeekMessageW); BOOL lRc = 0; if (F(PeekMessageW)) lRc = F(PeekMessageW)(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if (lRc && ghAttachGuiClient) PatchGuiMessage(true, lpMsg->hwnd, lpMsg->message, lpMsg->wParam, lpMsg->lParam); return lRc; }
int WINAPI OnReleaseDC(HWND hWnd, HDC hDC) { //typedef int (WINAPI* OnReleaseDC_t)(HWND hWnd, HDC hDC); ORIGINAL_EX(ReleaseDC); int iRc = 0; if (F(ReleaseDC)) iRc = F(ReleaseDC)(hWnd, hDC); if (ghTempHDC == hDC) ghTempHDC = NULL; return iRc; }
BOOL WINAPI OnGetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { //typedef BOOL (WINAPI* OnGetMessageA_t)(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); ORIGINAL_EX(GetMessageA); BOOL lRc = 0; if (F(GetMessageA)) lRc = F(GetMessageA)(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); if (lRc && ghAttachGuiClient) PatchGuiMessage(true, lpMsg->hwnd, lpMsg->message, lpMsg->wParam, lpMsg->lParam); return lRc; }
HDC WINAPI OnGetDCEx(HWND hWnd, HRGN hrgnClip, DWORD flags) { //typedef HDC (WINAPI* OnGetDCEx_t)(HWND hWnd, HRGN hrgnClip, DWORD flags); ORIGINAL_EX(GetDCEx); HDC hDC = NULL; if (F(GetDCEx)) hDC = F(GetDCEx)(hWnd, hrgnClip, flags); if (hDC && ghConEmuWndDC && hWnd == ghConEmuWndDC) ghTempHDC = hDC; return hDC; }
HDC WINAPI OnGetDC(HWND hWnd) { //typedef HDC (WINAPI* OnGetDC_t)(HWND hWnd); ORIGINAL_EX(GetDC); HDC hDC = NULL; if (F(GetDC)) hDC = F(GetDC)(hWnd); if (hDC && ghConEmuWndDC && hWnd == ghConEmuWndDC) ghTempHDC = hDC; return hDC; }
BOOL WINAPI OnFlashWindow(HWND hWnd, BOOL bInvert) { //typedef BOOL (WINAPI* OnFlashWindow_t)(HWND hWnd, BOOL bInvert); ORIGINAL_EX(FlashWindow); if (ghConEmuWndDC) { GuiFlashWindow(eFlashSimple, hWnd, bInvert, 0,0,0); return TRUE; } BOOL lbRc = NULL; if (F(FlashWindow) != NULL) lbRc = F(FlashWindow)(hWnd, bInvert); return lbRc; }
int WINAPI OnGetClassNameW(HWND hWnd, LPWSTR lpClassName, int nMaxCount) { //typedef int (WINAPI *OnGetClassNameW_t)(HWND hWnd, LPWSTR lpClassName, int nMaxCount); ORIGINAL_EX(GetClassNameW); int iRc = 0; if (ghConEmuWndDC && hWnd == ghConEmuWndDC && lpClassName) { lstrcpynW(lpClassName, RealConsoleClass, nMaxCount); iRc = lstrlenW(lpClassName); } else if (F(GetClassNameW)) { iRc = F(GetClassNameW)(hWnd, lpClassName, nMaxCount); } return iRc; }
BOOL WINAPI OnFlashWindowEx(PFLASHWINFO pfwi) { //typedef BOOL (WINAPI* OnFlashWindowEx_t)(PFLASHWINFO pfwi); ORIGINAL_EX(FlashWindowEx); if (ghConEmuWndDC) { GuiFlashWindow(eFlashNormal, pfwi->hwnd, 0, pfwi->dwFlags, pfwi->uCount, pfwi->dwTimeout); return TRUE; } BOOL lbRc = FALSE; if (F(FlashWindowEx) != NULL) lbRc = F(FlashWindowEx)(pfwi); return lbRc; }
LRESULT WINAPI OnSendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { //typedef LRESULT (WINAPI* OnSendMessageW_t)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); ORIGINAL_EX(SendMessageW); LRESULT lRc = 0; if (!CanSendMessage(hWnd, Msg, wParam, lParam, lRc)) return lRc; // Обманем, это сообщение запрещено посылать в ConEmuDC if (ghAttachGuiClient) PatchGuiMessage(false, hWnd, Msg, wParam, lParam); if (F(SendMessageW)) lRc = F(SendMessageW)(hWnd, Msg, wParam, lParam); return lRc; }
BOOL WINAPI OnScreenToClient(HWND hWnd, LPPOINT lpPoint) { //typedef BOOL (WINAPI* OnScreenToClient_t)(HWND hWnd, LPPOINT lpPoint); ORIGINAL_EX(ScreenToClient); BOOL lbRc = FALSE; if (F(ScreenToClient) != NULL) lbRc = F(ScreenToClient)(hWnd, lpPoint); if (lbRc && ghConEmuWndDC && lpPoint && (hWnd == ghConWnd)) { //EMenu text mode issues. "Remove" Far window from mouse cursor. lpPoint->x = lpPoint->y = -1; } return lbRc; }
HWND WINAPI OnSetFocus(HWND hWnd) { //typedef HWND (WINAPI* OnSetFocus_t)(HWND hWnd); ORIGINAL_EX(SetFocus); HWND hRet = NULL; DWORD nPID = 0, nTID = 0; if (ghAttachGuiClient && ((nTID = GetWindowThreadProcessId(hWnd, &nPID)) != 0)) { ghAttachGuiFocused = (nPID == GetCurrentProcessId()) ? hWnd : NULL; } if (F(SetFocus)) hRet = F(SetFocus)(hWnd); return hRet; }
//Issue 469: Some programs requires "ConsoleWindowClass" for GetConsoleWindow int WINAPI OnGetClassNameA(HWND hWnd, LPSTR lpClassName, int nMaxCount) { //typedef int (WINAPI *OnGetClassNameA_t)(HWND hWnd, LPSTR lpClassName, int nMaxCount); ORIGINAL_EX(GetClassNameA); int iRc = 0; if (ghConEmuWndDC && hWnd == ghConEmuWndDC && lpClassName) { //lstrcpynA(lpClassName, RealConsoleClass, nMaxCount); WideCharToMultiByte(CP_ACP, 0, RealConsoleClass, -1, lpClassName, nMaxCount, 0,0); iRc = lstrlenA(lpClassName); } else if (F(GetClassNameA)) { iRc = F(GetClassNameA)(hWnd, lpClassName, nMaxCount); } return iRc; }
BOOL WINAPI OnGetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl) { //typedef BOOL (WINAPI* OnGetWindowPlacement_t)(HWND hWnd, WINDOWPLACEMENT *lpwndpl); ORIGINAL_EX(GetWindowPlacement); BOOL lbRc = FALSE; if (F(GetWindowPlacement)) lbRc = F(GetWindowPlacement)(hWnd, lpwndpl); if (lbRc && ghConEmuWndDC && !gbGuiClientExternMode && ghAttachGuiClient && hWnd == ghAttachGuiClient) { MapWindowPoints(ghConEmuWndDC, NULL, (LPPOINT)&lpwndpl->rcNormalPosition, 2); } return lbRc; }