diff -ru gtk+.orig\gdk\win32\gdkdnd-win32.c gtk+\gdk\win32\gdkdnd-win32.c
--- gtk+.orig\gdk\win32\gdkdnd-win32.c	Tue Jul 27 12:01:58 2004
+++ gtk+\gdk\win32\gdkdnd-win32.c	Tue Jul 27 12:01:37 2004
@@ -1361,9 +1361,13 @@
 				 GdkDragProtocol *protocol)
 {
   find_window_enum_arg a;
+  RECT rect;
+  GdkRectangle mrect;
 
-  a.x = x_root;
-  a.y = y_root;
+  gdk_screen_get_monitor_geometry (gdk_screen_get_default (), 0, &mrect);
+  SystemParametersInfo (SPI_GETWORKAREA, 0, &rect, 0);
+  a.x = x_root + rect.left - mrect.x;
+  a.y = y_root + rect.top  - mrect.y;
   a.ignore = drag_window ? GDK_WINDOW_HWND (drag_window) : NULL;
   a.result = NULL;
 
diff -ru gtk+.orig\gtk\gtkdnd.c gtk+\gtk\gtkdnd.c
--- gtk+.orig\gtk\gtkdnd.c	Tue Jul 27 11:52:43 2004
+++ gtk+\gtk\gtkdnd.c	Tue Jul 27 12:02:33 2004
@@ -1094,6 +1094,14 @@
 	  gdk_window_get_origin (toplevel->window, &tx, &ty);
 	else
 #endif /* GDK_WINDOWING_X11 */
+#ifdef GDK_WINDOWING_WIN32
+	/* On windows, gdk_window_get_position returns wrong values when you
+	 * have multiple monitors or the startbar at the top of the screen.
+	 */
+	if (TRUE)
+      gdk_window_get_origin (toplevel->window, &tx, &ty);
+    else
+#endif
 	  gdk_window_get_position (toplevel->window, &tx, &ty);
 
 	data.x = event->dnd.x_root - tx;
