diff --git a/src/openttd.cpp b/src/openttd.cpp
index cda4aa3c11..00ddade4bb 100644
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -782,6 +782,7 @@ int ttd_main(int argc, char *argv[])
 
 	/* restore saved music volume */
 	_music_driver->SetVolume(_settings_client.music.music_vol);
+	_video_driver->ClaimMousePointer();
 
 	NetworkStartUp(); // initialize network-core
 
diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp
index 54c5c9cd37..39203cbca3 100644
--- a/src/os/windows/win32.cpp
+++ b/src/os/windows/win32.cpp
@@ -28,14 +28,16 @@
 #include <sys/stat.h>
 
 static bool _has_console;
+static bool _cursor_disable = true;
+static bool _cursor_visible = true;
 
-static bool cursor_visible = true;
-
-bool MyShowCursor(bool show)
+bool MyShowCursor(bool show, bool toggle)
 {
-	if (cursor_visible == show) return show;
+	if (toggle) _cursor_disable = !_cursor_disable;
+	if (_cursor_disable) return show;
+	if (_cursor_visible == show) return show;
 
-	cursor_visible = show;
+	_cursor_visible = show;
 	ShowCursor(show);
 
 	return !show;
diff --git a/src/os/windows/win32.h b/src/os/windows/win32.h
index 19f04d1f2f..66c519973f 100644
--- a/src/os/windows/win32.h
+++ b/src/os/windows/win32.h
@@ -13,7 +13,7 @@
 #define WIN32_H
 
 #include <windows.h>
-bool MyShowCursor(bool show);
+bool MyShowCursor(bool show, bool toggle = false);
 
 typedef void (*Function)(int);
 bool LoadLibraryList(Function proc[], const char *dll);
diff --git a/src/video/allegro_v.cpp b/src/video/allegro_v.cpp
index 27b7a44488..0154cb519f 100644
--- a/src/video/allegro_v.cpp
+++ b/src/video/allegro_v.cpp
@@ -225,11 +225,23 @@ static bool CreateMainSurface(uint w, uint h)
 	snprintf(caption, sizeof(caption), "OpenTTD %s", _openttd_revision);
 	set_window_title(caption);
 
+	enable_hardware_cursor();
+	select_mouse_cursor(MOUSE_CURSOR_ARROW);
+	show_mouse(_allegro_screen);
+
 	GameSizeChanged();
 
 	return true;
 }
 
+bool VideoDriver_Allegro::ClaimMousePointer()
+{
+	select_mouse_cursor(MOUSE_CURSOR_NONE);
+	show_mouse(_allegro_screen);
+	disable_hardware_cursor();
+	return true;
+}
+
 struct VkMapping {
 	uint16 vk_from;
 	byte vk_count;
diff --git a/src/video/allegro_v.h b/src/video/allegro_v.h
index 6a81159ca3..da95269ce3 100644
--- a/src/video/allegro_v.h
+++ b/src/video/allegro_v.h
@@ -31,6 +31,8 @@ public:
 
 	/* virtual */ bool AfterBlitterChange();
 
+	/* virtual */ bool ClaimMousePointer();
+
 	/* virtual */ const char *GetName() const { return "allegro"; }
 };
 
diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp
index 8768004b69..ebb0ca7575 100644
--- a/src/video/sdl_v.cpp
+++ b/src/video/sdl_v.cpp
@@ -259,13 +259,18 @@ static bool CreateMainSurface(uint w, uint h)
 
 	snprintf(caption, sizeof(caption), "OpenTTD %s", _openttd_revision);
 	SDL_CALL SDL_WM_SetCaption(caption, caption);
-	SDL_CALL SDL_ShowCursor(0);
 
 	GameSizeChanged();
 
 	return true;
 }
 
+bool VideoDriver_SDL::ClaimMousePointer()
+{
+	SDL_CALL SDL_ShowCursor(0);
+	return true;
+}
+
 struct VkMapping {
 	uint16 vk_from;
 	byte vk_count;
diff --git a/src/video/sdl_v.h b/src/video/sdl_v.h
index baecc7ba74..e4df2a30ae 100644
--- a/src/video/sdl_v.h
+++ b/src/video/sdl_v.h
@@ -31,6 +31,8 @@ public:
 
 	/* virtual */ bool AfterBlitterChange();
 
+	/* virtual */ bool ClaimMousePointer();
+
 	/* virtual */ const char *GetName() const { return "sdl"; }
 };
 
diff --git a/src/video/video_driver.hpp b/src/video/video_driver.hpp
index 4e8a2a0a1f..306fe28039 100644
--- a/src/video/video_driver.hpp
+++ b/src/video/video_driver.hpp
@@ -56,6 +56,11 @@ public:
 		return true;
 	}
 
+	virtual bool ClaimMousePointer()
+	{
+		return true;
+	}
+
 	/**
 	 * Whether the driver has a graphical user interface with the end user.
 	 * Or in other words, whether we should spawn a thread for world generation
diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp
index cc242fb2e5..f571638b8d 100644
--- a/src/video/win32_v.cpp
+++ b/src/video/win32_v.cpp
@@ -81,6 +81,12 @@ static void UpdatePalette(HDC dc, uint start, uint count)
 	SetDIBColorTable(dc, start, count, rgb);
 }
 
+bool VideoDriver_Win32::ClaimMousePointer()
+{
+	MyShowCursor(false, true);
+	return true;
+}
+
 struct VkMapping {
 	byte vk_from;
 	byte vk_count;
diff --git a/src/video/win32_v.h b/src/video/win32_v.h
index f6c562a940..0706c0ee7a 100644
--- a/src/video/win32_v.h
+++ b/src/video/win32_v.h
@@ -31,6 +31,8 @@ public:
 
 	/* virtual */ bool AfterBlitterChange();
 
+	/* virtual */ bool ClaimMousePointer();
+
 	/* virtual */ const char *GetName() const { return "win32"; }
 
 	bool MakeWindow(bool full_screen);