diff --git a/include/fmt/format-inl.h b/include/fmt/format-inl.h
index 788dafb8..d1279e70 100644
--- a/include/fmt/format-inl.h
+++ b/include/fmt/format-inl.h
@@ -23,16 +23,23 @@
 #endif
 
 #ifdef _WIN32
-#  if defined(FMT_BIG_WIN) || defined(NOMINMAX)
-#    include <windows.h>
-#  else
-#    define NOMINMAX
-#    define WIN32_LEAN_AND_MEAN
-#    include <windows.h>
-#    undef WIN32_LEAN_AND_MEAN
-#    undef NOMINMAX
-#  endif
 #  include <io.h>
+FMT_BEGIN_NAMESPACE
+namespace details {
+
+#  if !defined(__LP64__)
+using DWORD = unsigned long;
+#  else
+using DWORD = unsigned int;
+#  endif
+// WriteConsoleW should not become visible in global namespace
+extern "C" {
+int __stdcall WriteConsoleW(void* hConsoleOutput, const void* lpBuffer,
+                            DWORD nNumberOfCharsToWrite,
+                            DWORD* lpNumberOfCharsWritten, void* lpReserved);
+}
+}  // namespace details
+FMT_END_NAMESPACE
 #endif
 
 // Dummy implementations of strerror_r and strerror_s called if corresponding
@@ -2897,10 +2904,10 @@ FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) {
   auto fd = _fileno(f);
   if (_isatty(fd)) {
     detail::utf8_to_utf16 u16(string_view(buffer.data(), buffer.size()));
-    auto written = DWORD();
-    if (!WriteConsoleW(reinterpret_cast<HANDLE>(_get_osfhandle(fd)),
-                       u16.c_str(), static_cast<DWORD>(u16.size()), &written,
-                       nullptr)) {
+    auto written = details::DWORD();
+    if (!details::WriteConsoleW(
+            reinterpret_cast<void*>(_get_osfhandle(fd)), u16.c_str(),
+            static_cast<details::DWORD>(u16.size()), &written, nullptr)) {
       FMT_THROW(format_error("failed to write to console"));
     }
     return;