Index: src/kmessdebug.cpp
===================================================================
--- src/kmessdebug.cpp	(revision 3650)
+++ src/kmessdebug.cpp	(working copy)
@@ -22,8 +22,16 @@
 #include <unistd.h>
 
 #include <QTime>
+#include <QtCore>
 
+#ifdef Q_OS_WIN
+  #include <QFile>
+  #define EOL "\r\n"
+#else
+  #define EOL "\n"
+#endif
 
+
 // kmessdebug.h adds a KMESS_NULL macro to detect
 // and display null pointer warnings. This is used
 // in a " if(KMESS_NULL(var)) return; " statement
@@ -167,13 +175,77 @@
   bool isAssert = ( strncmp( message, "ASSERT", 7 ) == 0 ); // 'ASSERT failure' or 'ASSERT: '
   static QTime timer;
   if( ! timer.isValid() )
+  {
     timer.start();
+  }
+
   float elapsed = (float)timer.elapsed() / (float)1000;
 
+
+// Quick hack to get debug output on Windows.
+#ifdef Q_OS_WIN
+  static QFile debugFile;
+  QString debugLine;
+
+  if( ! debugFile.isOpen() )
+  {
+    debugFile.setFileName("C:\\kmessdebug.log");
+    if( ! debugFile.open( QFile::WriteOnly ) )
+    {
+      fprintf( stderr, "%.3f> WARNING: %s" EOL, elapsed, "unable to open debug file: C:\\kmessdebug.log" );
+      abort();
+    }
+  }
+
+  if( ! debugFile.isOpen() )
+  {
+    return;
+  }
+
   if( isAssert )
   {
+    debugLine.sprintf( "%.3f> kmess(%d) %s" EOL, elapsed, getpid(), message );
+    debugFile.write( debugLine.toUtf8() );
+    debugFile.flush();
+
+#ifdef KMESSTEST
+    if( type == QtFatalMsg )
+    {
+      abort();
+    }
+#endif
+
+  }
+  else
+  {
+    switch( type )
+    {
+      case QtDebugMsg:
+        debugLine.sprintf( "%.3f> %s" EOL, elapsed, message );
+        break;
+
+      case QtWarningMsg:
+        debugLine.sprintf( "%.3f> WARNING: %s" EOL, elapsed, message );
+        break;
+
+      case QtCriticalMsg:
+        debugLine.sprintf( "%.3f> CRITICAL: %s" EOL, elapsed, message );
+        break;
+
+      case QtFatalMsg:
+        debugLine.sprintf( "%.3f> FATAL: %s" EOL, elapsed, message );
+    }
+
+    debugFile.write( debugLine.toUtf8() );
+    debugFile.flush();
+  }
+#endif
+
+
+  if( isAssert )
+  {
     // can be qWarning() by us or qFatal() from Qt.
-    fprintf( stderr, "%.3f> kmess(%d) %s\n", elapsed, getpid(), message );
+    fprintf( stderr, "%.3f> kmess(%d) %s" EOL, elapsed, getpid(), message );
 
 #ifdef KMESSTEST
     // Crash on qFatal() from Qt, called from Q_ASSERT()
@@ -189,19 +261,19 @@
     switch( type )
     {
       case QtDebugMsg:
-        fprintf( stderr, "%.3f> %s\n", elapsed, message );
+        fprintf( stderr, "%.3f> %s" EOL, elapsed, message );
         break;
 
       case QtWarningMsg:
-        fprintf( stderr, "%.3f> WARNING: %s\n", elapsed, message );
+        fprintf( stderr, "%.3f> WARNING: %s" EOL, elapsed, message );
         break;
 
       case QtCriticalMsg:
-        fprintf( stderr, "%.3f> CRITICAL: %s\n", elapsed, message );
+        fprintf( stderr, "%.3f> CRITICAL: %s" EOL, elapsed, message );
         break;
 
       case QtFatalMsg:
-        fprintf( stderr, "%.3f> FATAL: %s\n", elapsed, message );
+        fprintf( stderr, "%.3f> FATAL: %s" EOL, elapsed, message );
 
 #ifdef KMESSTEST
         abort();
Index: src/kmessdebug.h
===================================================================
--- src/kmessdebug.h	(revision 3650)
+++ src/kmessdebug.h	(working copy)
@@ -24,7 +24,15 @@
 // reason to include this file by default so no one else has to.
 #include <KDebug>
 
+#ifdef Q_OS_WIN
+  #include <QDebug>
 
+  #undef kDebug
+  #undef kWarning
+  #define kDebug ( QDebug(QtDebugMsg) << Q_FUNC_INFO ).space
+  #define kWarning ( QDebug(QtWarningMsg) << Q_FUNC_INFO ).space
+#endif
+
 #if ( KMESS_DEBUG == 1)
   #define KMESSTEST
   #define KMESS_NETWORK_WINDOW

