This commit is contained in:
DavidXanatos 2024-04-20 09:40:14 +02:00
parent 08be155b61
commit 55d54a2e02
3 changed files with 92 additions and 43 deletions

View File

@ -1374,9 +1374,13 @@ _FX HWND Gui_CreateWindowExW(
else
hWndParent = NULL;
}
if (SbieApi_QueryConfBool(NULL, "BlockInterferenceControl", FALSE))
if (Gui_BlockInterferenceControl){
if (dwExStyle & WS_EX_TOPMOST)
dwExStyle = dwExStyle & ~WS_EX_TOPMOST;
}
//
// create window
//
@ -1480,9 +1484,11 @@ _FX HWND Gui_CreateWindowExA(
else
clsnm = Gui_CreateClassNameA(lpClassName);
if (SbieApi_QueryConfBool(NULL, "BlockInterferenceControl", FALSE))
if (Gui_BlockInterferenceControl){
if (dwExStyle & WS_EX_TOPMOST)
dwExStyle = dwExStyle & ~WS_EX_TOPMOST;
}
if (hWndParent && (hWndParent != HWND_MESSAGE)
&& (! __sys_IsWindow(hWndParent))) {
@ -1938,21 +1944,27 @@ _FX BOOL Gui_MoveWindow(
SetLastError(ERROR_INVALID_WINDOW_HANDLE);
return FALSE;
}
if (SbieApi_QueryConfBool(NULL, L"BlockInterferenceControl", FALSE)) {
RECT rt;
typedef (*P_SystemParametersInfoA)(UINT uiAction,
UINT uiParam,
PVOID pvParam,
UINT fWinIni);
typedef (*P_GetSystemMetrics)(int nIndex);
P_SystemParametersInfoA SystemParametersInfoA = Ldr_GetProcAddrNew("user32.dll", "SystemParametersInfoA", "SystemParametersInfoA"); if (!SystemParametersInfoA) goto then;
P_GetSystemMetrics GetSystemMetrics = Ldr_GetProcAddrNew("user32.dll", "GetSystemMetrics", "GetSystemMetrics"); if (!GetSystemMetrics) goto then;
SystemParametersInfoA(SPI_GETWORKAREA, 0, &rt, 0);
int y1 = GetSystemMetrics(SM_CYSCREEN) - rt.bottom;
if (y + h > y1)
h = y1 - y-2;
}
then:
if (Gui_BlockInterferenceControl) {
typedef BOOL (*P_SystemParametersInfoA)(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);
static P_SystemParametersInfoA SystemParametersInfoA = NULL;
if (!SystemParametersInfoA) SystemParametersInfoA = Ldr_GetProcAddrNew("user32.dll", "SystemParametersInfoA", "SystemParametersInfoA");
typedef int (*P_GetSystemMetrics)(int nIndex);
static P_GetSystemMetrics GetSystemMetrics = NULL;
if (!GetSystemMetrics) GetSystemMetrics = Ldr_GetProcAddrNew("user32.dll", "GetSystemMetrics", "GetSystemMetrics");
if (SystemParametersInfoA && GetSystemMetrics) {
RECT rt;
SystemParametersInfoA(SPI_GETWORKAREA, 0, &rt, 0);
int y1 = GetSystemMetrics(SM_CYSCREEN) - rt.bottom;
if (y + h > y1)
h = y1 - y - 2;
}
}
return __sys_MoveWindow(hWnd, x, y, w, h, bRepaint);
}
@ -1975,23 +1987,30 @@ _FX BOOL Gui_SetWindowPos(
//
// use SbieSvc GUI Proxy if hWnd is accessible but outside the sandbox
//
if (SbieApi_QueryConfBool(NULL, L"BlockInterferenceControl", FALSE)) {
if (hWndInsertAfter == HWND_TOPMOST || hWndInsertAfter == HWND_TOP)
hWndInsertAfter = HWND_DESKTOP;
RECT rt;
typedef (*P_SystemParametersInfoA)(UINT uiAction,
UINT uiParam,
PVOID pvParam,
UINT fWinIni);
typedef (*P_GetSystemMetrics)(int nIndex);
P_SystemParametersInfoA SystemParametersInfoA = Ldr_GetProcAddrNew("user32.dll", "SystemParametersInfoA", "SystemParametersInfoA"); if (!SystemParametersInfoA) goto then;
P_GetSystemMetrics GetSystemMetrics = Ldr_GetProcAddrNew("user32.dll", "GetSystemMetrics", "GetSystemMetrics"); if (!GetSystemMetrics) goto then;
SystemParametersInfoA(SPI_GETWORKAREA, 0, &rt, 0);
int y1 = GetSystemMetrics(SM_CYSCREEN) - rt.bottom;
if (y+h > y1)
h = y1-y - 2;
}
then:
if (Gui_BlockInterferenceControl) {
if (hWndInsertAfter == HWND_TOPMOST || hWndInsertAfter == HWND_TOP)
hWndInsertAfter = HWND_DESKTOP;
typedef BOOL (*P_SystemParametersInfoA)(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);
static P_SystemParametersInfoA SystemParametersInfoA = NULL;
if (!SystemParametersInfoA) SystemParametersInfoA = Ldr_GetProcAddrNew("user32.dll", "SystemParametersInfoA", "SystemParametersInfoA");
typedef int (*P_GetSystemMetrics)(int nIndex);
static P_GetSystemMetrics GetSystemMetrics = NULL;
if (!GetSystemMetrics) GetSystemMetrics = Ldr_GetProcAddrNew("user32.dll", "GetSystemMetrics", "GetSystemMetrics");
if (SystemParametersInfoA && GetSystemMetrics) {
RECT rt;
SystemParametersInfoA(SPI_GETWORKAREA, 0, &rt, 0);
int y1 = GetSystemMetrics(SM_CYSCREEN) - rt.bottom;
if (y + h > y1)
h = y1 - y - 2;
}
}
if (Gui_UseProxyService && !Gui_IsSameBox(hWnd, NULL, NULL)) {
GUI_SET_WINDOW_POS_REQ req;

View File

@ -502,6 +502,8 @@ extern BOOLEAN Gui_OpenAllWinClasses; // not running in a restricted job
extern BOOLEAN Gui_UseProtectScreen;
extern BOOLEAN Gui_UseBlockCapture;
extern BOOLEAN Gui_BlockInterferenceControl;
extern BOOLEAN Gui_UseProxyService;
extern BOOLEAN Gui_DisableTitle;

View File

@ -171,7 +171,7 @@ static ULONG Gui_OpenClipboard_seq = -1;
static HANDLE Gui_DummyInputDesktopHandle = NULL;
static BOOLEAN Gui_BlockInterferenceControl = FALSE;
BOOLEAN Gui_BlockInterferenceControl = FALSE;
//---------------------------------------------------------------------------
@ -201,10 +201,10 @@ _FX BOOLEAN Gui_InitMisc(HMODULE module)
SBIEDLL_HOOK_GUI(ClipCursor);
SBIEDLL_HOOK_GUI(SwapMouseButton);
SBIEDLL_HOOK_GUI(SetDoubleClickTime);
SBIEDLL_HOOK_GUI(ShowCursor);
SBIEDLL_HOOK_GUI(BringWindowToTop);
SBIEDLL_HOOK_GUI(SwitchToThisWindow);
SBIEDLL_HOOK_GUI(SetActiveWindow);
SBIEDLL_HOOK_GUI(ShowCursor);
SBIEDLL_HOOK_GUI(BringWindowToTop);
SBIEDLL_HOOK_GUI(SwitchToThisWindow);
SBIEDLL_HOOK_GUI(SetActiveWindow);
if (Gui_UseBlockCapture) {
SBIEDLL_HOOK_GUI(GetWindowDC);
@ -1648,25 +1648,53 @@ _FX EXECUTION_STATE Gui_SetThreadExecutionState(EXECUTION_STATE esFlags)
//return __sys_SetThreadExecutionState(esFlags);
}
_FX int Gui_ShowCursor(BOOL bShow) {
//---------------------------------------------------------------------------
// Gui_ShowCursor
//---------------------------------------------------------------------------
_FX int Gui_ShowCursor(BOOL bShow)
{
if (Gui_BlockInterferenceControl && !bShow)
return 0;
return __sys_ShowCursor(bShow);
}
_FX HWND Gui_SetActiveWindow(HWND hWnd) {
//---------------------------------------------------------------------------
// Gui_SetActiveWindow
//---------------------------------------------------------------------------
_FX HWND Gui_SetActiveWindow(HWND hWnd)
{
if (Gui_BlockInterferenceControl)
return NULL;
return __sys_SetActiveWindow(hWnd);
}
_FX BOOL Gui_BringWindowToTop(HWND hWnd) {
//---------------------------------------------------------------------------
// Gui_BringWindowToTop
//---------------------------------------------------------------------------
_FX BOOL Gui_BringWindowToTop(HWND hWnd)
{
if (Gui_BlockInterferenceControl)
return FALSE;
return __sys_BringWindowToTop(hWnd);
}
_FX void Gui_SwitchToThisWindow(HWND hWnd, BOOL fAlt) {
//---------------------------------------------------------------------------
// Gui_SwitchToThisWindow
//---------------------------------------------------------------------------
_FX void Gui_SwitchToThisWindow(HWND hWnd, BOOL fAlt)
{
if (Gui_BlockInterferenceControl)
return;
__sys_SwitchToThisWindow(hWnd, fAlt);