This is not strictly required and it does not even work all the time
regardless of what MSDN says, but it helps, especially when multiple
processes are creating windows.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
Note that this patch is completely optional and can be ignored. I had
more consistent results with it when running the test on my Windows 10
VM though but it doesn't seem to change much for the testbot.
v2: For the whole series, mostly whitespace fixes, and a rework of the
fix implementation to avoid messing with the message queues.
dlls/user32/tests/win.c | 50 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index 843da8900f1..c001247b651 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -11896,6 +11896,53 @@ static void test_other_process_window(const char *argv0)
DestroyWindow(hwnd);
}
+static void start_debugger( int argc, char **argv )
+{
+ HANDLE debug_ready;
+ BOOL ret;
+ char event_name[MAX_PATH];
+
+ if (argc == 4 && !strcmp( argv[2], "debugger" ))
+ {
+ DWORD pid;
+ DEBUG_EVENT de;
+
+ sprintf( event_name, "test_debug_%s", argv[3] );
+ debug_ready = OpenEventA( EVENT_ALL_ACCESS, FALSE, event_name );
+ ok( debug_ready != 0, "OpenEventA failed\n" );
+
+ sscanf( argv[3], "%x", &pid );
+ ret = DebugActiveProcess( pid );
+ ok( ret, "DebugActiveProcess failed, last error: %#x.\n", GetLastError() );
+
+ SetEvent( debug_ready );
+ ok( ret, "SetEvent failed, last error %#x.\n", GetLastError() );
+ CloseHandle( debug_ready );
+
+ while (WaitForDebugEvent( &de, INFINITE ))
+ ContinueDebugEvent( de.dwProcessId, de.dwThreadId, DBG_EXCEPTION_NOT_HANDLED );
+
+ exit( 0 );
+ }
+ else
+ {
+ PROCESS_INFORMATION pi;
+ STARTUPINFOA si = {sizeof(si)};
+ char cmd[MAX_PATH];
+
+ sprintf( event_name, "test_debug_%x", GetCurrentProcessId() );
+ debug_ready = CreateEventA( NULL, FALSE, FALSE, event_name );
+ ok( debug_ready != 0, "CreateEventA failed\n" );
+
+ sprintf( cmd, "%s win debugger %x", argv[0], GetCurrentProcessId() );
+ ret = CreateProcessA( NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
+ ok( ret, "CreateProcessA failed, last error: %#x.\n", GetLastError() );
+
+ WaitForSingleObject( debug_ready, INFINITE );
+ CloseHandle( debug_ready );
+ }
+}
+
START_TEST(win)
{
char **argv;
@@ -11920,6 +11967,9 @@ START_TEST(win)
pAdjustWindowRectExForDpi = (void *)GetProcAddress( user32, "AdjustWindowRectExForDpi" );
pSystemParametersInfoForDpi = (void *)GetProcAddress( user32, "SystemParametersInfoForDpi" );
+ /* attaching a debugger to the current process will make sure SetForegroundWindow always succeed */
+ start_debugger( argc, argv );
+
if (argc == 4)
{
HWND hwnd;
--
2.28.0