summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel/qclipboard_win.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@digia.com>2013-02-26 14:31:01 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-08-19 14:42:54 +0200
commit3f67fd3cbfe6804614dc5be7c64bef2fa8af180a (patch)
treed6be3b270fb2abd95e42b5ce38e30792070a4319 /src/gui/kernel/qclipboard_win.cpp
parent6d47f5a168e350a6d9cbddb343ff9d75ffbd2c04 (diff)
Do not send clipboard message to application under debugger.
Fix Qt Creator hang when copying a stack trace from an application showing a runtime assert. Change-Id: I874bd48643ebce1a3551644dc850cb7cf5869522 Reviewed-by: Kai Koehne <kai.koehne@digia.com> Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com> (cherry picked from qtbase/333817b9cf1304cca7c1dbd45880115cd128f60e)
Diffstat (limited to 'src/gui/kernel/qclipboard_win.cpp')
-rw-r--r--src/gui/kernel/qclipboard_win.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/gui/kernel/qclipboard_win.cpp b/src/gui/kernel/qclipboard_win.cpp
index 4ac59ef2d0..5c36c09620 100644
--- a/src/gui/kernel/qclipboard_win.cpp
+++ b/src/gui/kernel/qclipboard_win.cpp
@@ -300,6 +300,24 @@ void QClipboard::clear(Mode mode)
#endif
}
+#if !defined(Q_OS_WINCE) && defined(Q_CC_MSVC)
+static bool isProcessBeingDebugged(HWND hwnd)
+{
+ DWORD pid = 0;
+ if (!GetWindowThreadProcessId(hwnd, &pid) || !pid)
+ return false;
+ const HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
+ if (!processHandle)
+ return false;
+ BOOL debugged = FALSE;
+ CheckRemoteDebuggerPresent(processHandle, &debugged);
+ CloseHandle(processHandle);
+ return debugged != FALSE;
+}
+#else // !defined(Q_OS_WINCE) && defined(Q_CC_MSVC)
+static bool isProcessBeingDebugged(HWND) { return false; }
+#endif // defined(Q_OS_WINCE) || !defined(Q_CC_MSVC)
+
bool QClipboard::event(QEvent *e)
{
if (e->type() != QEvent::Clipboard)
@@ -338,6 +356,10 @@ bool QClipboard::event(QEvent *e)
}
if (ptrIsHungAppWindow && ptrIsHungAppWindow(d->nextClipboardViewer)) {
qWarning("%s: Cowardly refusing to send clipboard message to hung application...", Q_FUNC_INFO);
+ } else if (isProcessBeingDebugged(d->nextClipboardViewer)) {
+ // Also refuse if the process is being debugged, specifically, if it is
+ // displaying a runtime assert, which is not caught by isHungAppWindow().
+ qWarning("%s: Cowardly refusing to send clipboard message to application under debugger...", Q_FUNC_INFO);
} else {
SendMessage(d->nextClipboardViewer, m->message, m->wParam, m->lParam);
}