diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp
index a5431e584bf4f7d6aeae5c35ab4cc3f6fc0c5155..370b18ea1834c7f6445ecd1ff5bf9a193be45693 100644
--- a/src/plugins/debugger/debuggerdialogs.cpp
+++ b/src/plugins/debugger/debuggerdialogs.cpp
@@ -55,6 +55,7 @@
 #include <QtGui/QPushButton>
 #include <QtGui/QProxyModel>
 #include <QtGui/QSortFilterProxyModel>
+#include <QtGui/QMessageBox>
 
 using namespace Utils;
 
@@ -424,6 +425,20 @@ void AttachExternalDialog::pidChanged(const QString &pid)
     okButton()->setEnabled(enabled);
 }
 
+void AttachExternalDialog::accept()
+{
+#ifdef Q_OS_WIN
+    const qint64 pid = attachPID();
+    if (pid && isWinProcessBeingDebugged(pid)) {
+        QMessageBox::warning(this, tr("Process Already Under Debugger Control"),
+                             tr("The process %1 is already under the control of a debugger.\n"
+                                "Qt Creator cannot attach to it.").arg(pid));
+        return;
+    }
+#endif
+    QDialog::accept();
+}
+
 
 ///////////////////////////////////////////////////////////////////////
 //
diff --git a/src/plugins/debugger/debuggerdialogs.h b/src/plugins/debugger/debuggerdialogs.h
index 1cc868af4fe37f0ff6f7204a1c713e2a38cd1ff6..e9b9b2f9154a614cabc33fea59e3b2df22c51d10 100644
--- a/src/plugins/debugger/debuggerdialogs.h
+++ b/src/plugins/debugger/debuggerdialogs.h
@@ -92,6 +92,8 @@ public:
     qint64 attachPID() const;
     QString executable() const;
 
+    virtual void accept();
+
 private slots:
     void rebuildProcessList();
     void procSelected(const QModelIndex &index);
diff --git a/src/plugins/debugger/shared/dbgwinutils.cpp b/src/plugins/debugger/shared/dbgwinutils.cpp
index e4de625e22ce6e57b2d6dc54acd31e5884eb7f5b..1c5a1d210e9ad1a63bc4c1abb83f33fba74ea71e 100644
--- a/src/plugins/debugger/shared/dbgwinutils.cpp
+++ b/src/plugins/debugger/shared/dbgwinutils.cpp
@@ -242,5 +242,16 @@ QString winNormalizeFileName(const QString &f)
     return rc.isEmpty() ? f : rc;
 }
 
+bool isWinProcessBeingDebugged(unsigned long pid)
+{
+    HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
+    if (processHandle == NULL)
+        return false;
+    BOOL debugged = FALSE;
+    CheckRemoteDebuggerPresent(processHandle, &debugged);
+    CloseHandle(processHandle);
+    return debugged != FALSE;
+}
+
 } // namespace Internal
 } // namespace Debugger
diff --git a/src/plugins/debugger/shared/dbgwinutils.h b/src/plugins/debugger/shared/dbgwinutils.h
index 573c7ebd65e66b632e919191f406269c1e3520a1..8f841acd5cc88581673bb59d8b479db8b9de7d81 100644
--- a/src/plugins/debugger/shared/dbgwinutils.h
+++ b/src/plugins/debugger/shared/dbgwinutils.h
@@ -57,6 +57,8 @@ unsigned long winGetCurrentProcessId();
 
 QString winNormalizeFileName(const QString &f);
 
+bool isWinProcessBeingDebugged(unsigned long pid);
+
 } // namespace Internal
 } // namespace Debugger