Attempts to improve forcing synergy window to foreground. These
changes don't seem to improve the situation but don't seem to hurt either.
This commit is contained in:
parent
1fd7ce14f3
commit
9a245498a6
|
@ -540,17 +540,52 @@ CMSWindowsPrimaryScreen::showWindow()
|
||||||
m_lastForegroundWindow = GetForegroundWindow();
|
m_lastForegroundWindow = GetForegroundWindow();
|
||||||
m_lastActiveThread = GetWindowThreadProcessId(
|
m_lastActiveThread = GetWindowThreadProcessId(
|
||||||
m_lastForegroundWindow, NULL);
|
m_lastForegroundWindow, NULL);
|
||||||
|
DWORD myThread = GetCurrentThreadId();
|
||||||
if (m_lastActiveThread != 0) {
|
if (m_lastActiveThread != 0) {
|
||||||
DWORD myThread = GetCurrentThreadId();
|
if (myThread != m_lastActiveThread) {
|
||||||
if (AttachThreadInput(myThread, m_lastActiveThread, TRUE)) {
|
if (AttachThreadInput(myThread, m_lastActiveThread, TRUE)) {
|
||||||
m_lastActiveWindow = GetActiveWindow();
|
m_lastActiveWindow = GetActiveWindow();
|
||||||
AttachThreadInput(myThread, m_lastActiveThread, FALSE);
|
AttachThreadInput(myThread, m_lastActiveThread, FALSE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// show our window
|
// show our window
|
||||||
ShowWindow(m_window, SW_SHOW);
|
ShowWindow(m_window, SW_SHOW);
|
||||||
|
|
||||||
|
// force our window to the foreground. this is necessary to
|
||||||
|
// capture input but is complicated by microsoft's misguided
|
||||||
|
// attempt to prevent applications from changing the
|
||||||
|
// foreground window. (the user should be in control of that
|
||||||
|
// under normal circumstances but there are exceptions; the
|
||||||
|
// good folks at microsoft, after abusing the previously
|
||||||
|
// available ability to switch foreground tasks in many of
|
||||||
|
// their apps, changed the behavior to prevent it. maybe
|
||||||
|
// it was easier than fixing the applications.)
|
||||||
|
//
|
||||||
|
// anyway, simply calling SetForegroundWindow() doesn't work
|
||||||
|
// unless there is no foreground window or we already are the
|
||||||
|
// foreground window. so we AttachThreadInput() to the
|
||||||
|
// foreground process then call SetForegroundWindow(); that
|
||||||
|
// makes Windows think the foreground process changed the
|
||||||
|
// foreground window which is allowed since the foreground
|
||||||
|
// is "voluntarily" yielding control. then we unattach the
|
||||||
|
// thread input and go about our business.
|
||||||
|
//
|
||||||
|
// unfortunately, this still doesn't work for console windows
|
||||||
|
// on the windows 95 family. if a console is the foreground
|
||||||
|
// app on the server when the user leaves the server screen
|
||||||
|
// then the keyboard will not be captured by synergy.
|
||||||
|
if (m_lastActiveThread != myThread) {
|
||||||
|
if (m_lastActiveThread != 0) {
|
||||||
|
AttachThreadInput(myThread, m_lastActiveThread, TRUE);
|
||||||
|
}
|
||||||
|
SetForegroundWindow(m_window);
|
||||||
|
if (m_lastActiveThread != 0) {
|
||||||
|
AttachThreadInput(myThread, m_lastActiveThread, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// get keyboard input and capture mouse
|
// get keyboard input and capture mouse
|
||||||
SetActiveWindow(m_window);
|
SetActiveWindow(m_window);
|
||||||
SetFocus(m_window);
|
SetFocus(m_window);
|
||||||
|
|
Loading…
Reference in New Issue