RemoteMouseFix is a portable Windows tool for mouse and camera jumps in 3D games used through remote-control software. It was created for TeamViewer and World of Warcraft 3.3.5a, where a click into the 3D view can make the camera jump and remote camera turns are difficult to control.
The tool runs beside the game. It does not modify or inject code into the game, install a driver, require administrator rights, access the network, or write to the registry.
Important
RemoteMouseFix is experimental. The correction has been developed from measurements of TeamViewer with WoW 3.3.5a. Other games and remote-control applications may behave differently.
Both recordings show the same camera turn in WoW 3.3.5a through TeamViewer: the right mouse button is held while the pointer moves slowly left and right.
- Open the latest release and download the Windows x64 ZIP from Assets.
- Extract the complete ZIP into a normal folder. Do not run the EXE from inside the ZIP.
- Check
RemoteMouseFix.inibeside the EXE. The defaultExecutable=Wow.exeworks for any installed WoW executable with that filename. You can instead select one exact installation by its full path; see Target selection. - Start WoW normally, without administrator rights, and connect through TeamViewer.
- Double-click
Start-Playing.cmdand leave its console window open while playing. UseCtrl+Alt+Cto turn correction off immediately if needed.
Start-Playing.cmd uses the [Playing] target from RemoteMouseFix.ini, enables
the recommended absolute correction and a high-resolution 16 ms smoothing timer,
and writes compact diagnostics in logs/. Start-AB-Test.cmd has its own
[AB-Test] target and writes detailed diagnostics in logs-ab/.
The extracted ZIP contains:
Start-Playing.cmd WoW gameplay with correction enabled
Start-AB-Test.cmd compare corrections and record detailed logs
RemoteMouseFix.ini separate [Playing] and [AB-Test] targets
RemoteMouseFix.exe the correction tool
InputEchoCheck.exe synthetic input echo diagnostic
MouseLookProbe.exe developer/test tool (modes A, B, C)
README.md LICENSE
config/ diagnostic-only, A/B and Playing JSON profiles
docs/ diagnostic reference
logs/ created during normal playing
logs-ab/ created by A/B testing
Warning
Only WoW 3.3.5a with TeamViewer and a recentring hidden cursor has been
positively tested for this correction. A hidden cursor without recentering
(MouseLookProbe mode B) can lose mouse movement while correction is enabled.
Do not use the enabled Playing/A/B correction on an unverified application.
For observation without changing input, start RemoteMouseFix.exe with its
default diagnostic-only config/config.json profile.
The release EXE is not code-signed, and RemoteMouseFix installs a low-level mouse hook and sends synthetic mouse input. Both are normal for this kind of tool and both are things security software watches for, so expect warnings:
- SmartScreen may show "Windows protected your PC". Choose More info, then Run anyway, after you have checked the download as described below.
- Antivirus software may flag the EXE heuristically. If yours quarantines it, report a false positive to your vendor rather than disabling protection.
Every release lists the SHA-256 checksum of its ZIP. Verify it before extracting:
Get-FileHash -Algorithm SHA256 .\RemoteMouseFix-vX.Y.Z-win-x64.zipIf the value does not match the release notes, do not run the program. The full source is in this repository and can be built yourself, see Build from source.
The console keeps a live panel at the bottom. Each line answers one question, and the colour repeats the answer: green means working, yellow means waiting for you, red means the fix stopped itself.
TARGET * Wow.exe is in front
FIX * on (absolute) - correcting the pointer
WORK 20 jumps seen, 51 corrections applied
MARK #2 Ctrl+Alt+M = mark the start of a test section in the log
NEXT > Everything is working. Ctrl+Alt+C switches the fix off at any time.
MODES Ctrl+Alt+1 absolute | Ctrl+Alt+2 relative | Ctrl+Alt+C OFF
KEYS Ctrl+Alt+M MARK | Ctrl+Alt+P pause log | Ctrl+Alt+Q quit
TARGET in A/B mode (or GAME in the normal profile) is yellow while the
selected executable is not running or another window is in front. The fix only
works while that target window is in the foreground, so switching to it turns
the line green. FIX turns red when a watchdog switched the correction off,
and then says why; that state stays on screen instead of scrolling away. NEXT always
names the one thing to do next.
Set NO_COLOR=1 for a monochrome panel. When the output is redirected to a file, the
panel is printed once per change instead of being repainted.
Both launchers read their own section of RemoteMouseFix.ini next to
RemoteMouseFix.exe. For example, the A/B test can target the separate
MouseLookProbe program while normal playing stays on a specific WoW installation:
[AB-Test]
Executable=MouseLookProbe.exe
[Playing]
Executable=C:\Games\World of Warcraft\Wow.exeThe shipped INI contains Executable=Wow.exe for both sections. The
sample above is an example you can enter manually; do not select
MouseLookProbe.exe in mode B with active correction.
Use Executable=Wow.exe to match any running game process with that filename,
regardless of its installation directory. Alternatively supply a full
absolute Windows path to match only that exact executable installation.
Spaces in the path are supported. Enclosing the whole value in double quotes is optional;
Windows removes them when reading the INI. Your runtime test confirmed both forms.
Change the INI while the tool is stopped, save, and start the desired
Start-AB-Test.cmd or Start-Playing.cmd launcher as usual. No startup
question or JSON edit is needed. Both sections persist across sessions.
RemoteMouseFix does not launch a game. The path selects the process to
monitor and correct when the game is already running and in the foreground.
The selected target is shown as TARGET in A/B mode (or GAME in the
regular playing display). A missing INI or invalid target fails closed
before correction starts. The diagnostic-only profile remains unchanged.
The A/B profile additionally shows the number of markers written so far and all
test hotkeys. Each press of Ctrl+Alt+M creates the next numbered ## MARKER #N
entry. Keep a short note of what each marker represents; a marker identifies a
section boundary, not its meaning. An immediate notice confirms each marker.
| Hotkey | Effect |
|---|---|
Ctrl+Alt+C |
switch the correction off immediately |
Ctrl+Alt+M |
add a numbered marker to the log |
Ctrl+Alt+P |
pause/resume logging (correction continues) |
Ctrl+Alt+1 |
enable the recommended absolute correction |
Ctrl+Alt+2 |
enable the alternative relative correction |
Ctrl+Alt+Q |
quit RemoteMouseFix cleanly |
Closing the console also stops the tool. It leaves no service, driver, registry entry or game modification behind.
If Ctrl+Alt+C cannot be registered, RemoteMouseFix refuses to enable correction. This
ensures that a remote operator always has an emergency-off key.
| Setup | Status |
|---|---|
| TeamViewer with WoW 3.3.5a | measured target case; absolute is the recommended mode |
| Another game that repeatedly recentres a hidden cursor | unverified; test in diagnostic-only mode first and enable correction only after assessing compatibility |
| A game that hides the cursor without recentering it | unsupported with correction enabled; intercepted movement may be lost (Probe mode B) |
| A game that reads Raw Input | relative may work better, but Windows pointer settings can change its speed |
| Another remote-control application | unknown until tested; please submit a comparison log |
| Game running as administrator | unsupported; run the game and RemoteMouseFix normally, without elevation |
RemoteMouseFix cannot recreate pointer positions that the remote-control application never
delivered. It smooths delayed catch-up movement in absolute mode, but a poor connection
can still add latency.
The A/B profile records detailed mouse movement and opt-in 250 ms timing summaries
(## TIMING) to distinguish missing remote input, irregular timers and
unsent movement gated by the cursor anchor. Test logs are written to logs-ab/
separately from normal-play logs/; up to 50 files are retained, but the
oldest still rotate out. Copy important captures into an archive outside the
rotating folders. The tool never records keyboard input or text, and it has no
upload or network feature. You decide whether to share a log.
- Start the game and move to a quiet, safe location.
- Double-click
Start-AB-Test.cmdfrom the RemoteMouseFix folder. - Confirm that the console names
config-ab-test.json, thatTARGETshows the executable from[AB-Test]inRemoteMouseFix.ini, and thatFIXis on withabsolute.TARGETturns green when you click into the chosen application. - Test the same actions in each mode:
absolute,off, thenrelative. UseCtrl+Alt+1,Ctrl+Alt+CandCtrl+Alt+2to select the modes. - Before every action, press
Ctrl+Alt+Mto add a marker to the log:- click once into the 3D view without moving the mouse;
- hold the right mouse button and turn slowly left and right;
- hold the left mouse button and drag slowly.
- Note for each mode whether the camera is smooth, jumps, or moves too fast or too slowly.
- Press
Ctrl+Alt+C, thenCtrl+Alt+Q. - Open the newest file in
logs-aband check that its final lines reportqueue drops 0andwatchdog trips 0. - ZIP that log and attach it to a
GitHub issue together
with:
- game and version;
- remote-control application and version;
- Windows version;
- display resolution and scaling;
- your observations for each mode.
Logs are limited to the configured target process. They contain mouse positions, timing, window geometry, process names and numeric process/window identifiers. Focus-change lines may name another application that briefly became active. Review a log before publishing it if that information matters to you. Never include account details, chat content or other unrelated screenshots in a report.
With absolute remote input, a single drag can only turn as far as the remote pointer can travel on the controlling screen. Release and grab again to continue turning.
WoW hides the cursor while controlling the camera, repeatedly moves it back to a fixed anchor and interprets the distance from that anchor as camera movement. The measurement of 2026-09-12 found that TeamViewer delivered each pointer update as an injected absolute position. This overwrote the game's cursor warp and left the pointer 140 to 410 physical pixels away from the anchor instead of 1 to 3 pixels.
Only while a correction mode is active, the target window is in front and its cursor is hidden, RemoteMouseFix:
- withholds injected mouse-move events from another program so the game's warp stays intact;
- calculates how far the remote pointer itself moved;
- sends that movement back to the game in a marked
SendInputevent.
Buttons, the wheel and physical mouse input are never withheld or changed. UI clicks stay untouched because the cursor is visible in the game UI.
The full evidence and its limitations are in docs/findings-2026-09-12.md.
| Mode | Output | Trade-off |
|---|---|---|
off |
no correction | observation and baseline comparison only |
absolute |
absolute SendInput to the cursor position plus delta |
exact pixels without pointer acceleration; recommended for WoW 3.3.5a |
relative |
relative SendInput |
can suit Raw Input readers, but pointer speed and acceleration distort movement |
absolute spreads batched TeamViewer movement across steps of at most 20 pixels per axis
every 16 ms. A high-resolution Windows waitable timer is enabled in both the A/B and
Playing profiles; if unavailable, the tool falls back to WM_TIMER. The high-resolution
timer improved measured timing consistency, but cannot repair input gaps in TeamViewer.
Pending movement is discarded on mouse-button release, focus loss or
correction shutdown. When new remote movement reverses an axis, stale queued movement on
that axis is discarded so the camera follows the new direction without elastic pullback.
Opposing deltas below 5 pixels are treated as remote-input noise.
A SetCursorPos implementation was also tested and rejected. It lost about 40 percent of
movement because it raced with the input thread finishing the withheld event. SendInput
is queued behind that event and is processed in order.
- The plain
RemoteMouseFix.exeusesconfig.json, which is diagnostic-only and cannot enable correction. Start-Playing.cmdandStart-AB-Test.cmdexplicitly select profiles that permit correction and start inabsolutemode.Ctrl+Alt+Cswitches correction off immediately.- Releasing the mouse button or changing focus ends the intervention at once.
- Watchdogs disable correction after an unusually long hidden-cursor phase, repeated output failures, or synthetic events that fail to return through the hook.
- There is no DLL injection, driver, kernel component or code in the game process.
- There is no installer, registry write, network access or change to game files.
- There is no keyboard hook.
RegisterHotKeycan observe only the documented hotkeys. - Input outside the configured target application is discarded before it is logged.
- Windows 10 or Windows 11, x64
- the game and RemoteMouseFix running at the same integrity level
Windows silently discards synthetic input sent to a more privileged window. If the log
shows <access-denied> in the process column, run both applications without elevation.
The release EXE is statically linked and depends only on Windows system libraries.
config\config.json is read from the program folder unless another path is supplied as
the first command-line argument:
RemoteMouseFix.exe [path\to\config.json] [--seconds N]
A relative name that is not found beside the EXE is looked up in config\ as well, so a
folder from a release before 0.7 keeps working after an in-place update.
Keys beginning with _ in the supplied configuration files are explanatory comments.
| Key | Built-in default | Meaning |
|---|---|---|
target_process |
Wow.exe |
fallback target name; the A/B and Playing profiles select their executable from RemoteMouseFix.ini |
target_ini_section |
empty | AB-Test or Playing enables that named section in RemoteMouseFix.ini for a name or full-path match |
diagnostic_mode |
true |
true prevents all correction; false permits correction modes |
correction_mode |
off |
startup mode: off, absolute or relative |
watchdog_max_hidden_ms |
180000 |
hidden cursor duration before correction is disabled; 0 disables this check |
watchdog_max_unechoed |
50 |
own events allowed outstanding before the echo watchdog trips |
watchdog_max_output_failures |
5 |
consecutive failed output calls before the watchdog trips |
log_mouse_moves |
true |
false records buttons, wheel and state only |
trace_correction_timing |
false |
opt-in 250 ms timer/anchor/pending-delta summaries; enabled in A/B profile |
high_res_smoothing_timer |
false |
high-resolution waitable clock for 16 ms smoothing (with WM_TIMER fallback); explicitly true in shipped A/B and Playing profiles |
log_directory |
logs |
relative paths resolve beside the EXE |
log_file_prefix |
remotemousefix |
log filename prefix |
max_log_bytes |
8388608 |
rotate after this size |
max_log_files |
5 |
number of log files retained |
flush_on_button |
true |
flush after every button event |
jump_threshold_px |
40 |
tag a move as JUMP from this delta |
anchor_tolerance_px |
3 |
tag a move near the learned anchor as ANCHOR |
state_poll_interval_ms |
10 |
cursor-state and anchor-learning interval |
log_state_changes |
true |
write state-transition lines |
console_status_interval_ms |
2000 |
live console interval; 0 disables it |
heartbeat_interval_ms |
10000 |
log heartbeat interval; 0 disables it |
Log files rotate by prefix. The A/B profile uses logs-ab/ (50 files maximum) and
normal playing uses logs/ (5 files maximum). Copy any log you wish to preserve
into another folder before taking more captures.
Install Visual Studio 2019 or newer, or the Visual Studio Build Tools, with Desktop development with C++ and CMake 3.20 or newer.
cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config ReleaseThe result in build\bin\Release contains RemoteMouseFix.exe, MouseLookProbe.exe, all
three configuration profiles and both .cmd launchers.
sudo apt install g++-mingw-w64-x86-64 cmake
cmake -S . -B build-mingw -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mingw-w64-x64.cmake
cmake --build build-mingw -jFor a toolchain outside PATH, add
-DRMF_MINGW_PREFIX=$HOME/.local/opt/mingw-w64/usr. Use -DRMF_BUILD_PROBE=OFF to omit
the test probe. CMakeLists.txt rejects a native Linux target.
If the correction switches itself off with "own moves never reached the hook", run
InputEchoCheck.exe from the same folder. It sends eight signed mouse moves of one pixel
and reports how many come back through its own low-level hook, along with the foreground
window and its integrity level, which decides whether Windows discards synthetic input
silently (UIPI). Start it, click into the game during the countdown, hold the right mouse
button to have the mouse-look state measured, and attach the resulting
input-echo-check.txt to a report.
Quit RemoteMouseFix first, with Ctrl+Alt+Q. While it corrects, it withholds exactly the
kind of input this check sends, so its filter, not the system, would decide the result.
MouseLookProbe.exe has three selectable experiment modes to isolate why
TeamViewer pauses during mouse-look. The original hidden-cursor + warp behavior
remains the default, including for the automated script.
| Probe mode | Cursor | Repeated SetCursorPos |
Purpose |
|---|---|---|---|
| A – visible / no warp | visible | no | character-selection-like baseline |
| B – hidden / no warp | hidden | no | isolate cursor hiding |
| C – hidden + warp | hidden | yes | original WoW-like mouse-look simulation |
Choose a radio button in the probe window before dragging. Hold the left or right
mouse button in the empty area, then release before switching modes. Modes A/B use
ordinary GetCursorPos deltas, so keep drags short to avoid the screen edge.
Each phase records its selected mode in mouselook-probe.log. The optional
--mode visible|hidden|warp selects the initial mode; warp is the default.
Test A, B and C via TeamViewer first without RemoteMouseFix targeting the probe. Pauses only in C suggest repeated cursor repositioning; pauses in B and C suggest that hiding the cursor contributes. These are indicators rather than proof of WoW behavior: the probe is only an approximation of the game's input loop.
tools/probe/emulate-remote.ps1 starts both programs, injects a TeamViewer-shaped absolute stream and runs a click without motion, a steady drag and a stalled drag. A click without movement must sum to zero. A drag of known length must sum to that length. The probe reads the cursor position as WoW does, so passing this test does not prove compatibility with games that use Raw Input.
The detailed log format and acceptance criteria are documented in docs/diagnostics.md.
RemoteMouseFix/
CMakeLists.txt build and version
config/ safe, gameplay and A/B profiles with launchers
cmake/ version template and MinGW toolchain
docs/ diagnostic reference and measured findings
include/rmf/ C++ headers
src/ application implementation
tools/probe/ stand-in game and remote-input emulator
tools/echo-check/ input echo and integrity-level check
Reports from other setups are the most useful contribution, see Report a problem or test another setup. CONTRIBUTING.md describes the build, the test requirements and the safety rules every change has to respect. Security problems go through SECURITY.md, not through a public issue. Released changes are listed in CHANGELOG.md.
If RemoteMouseFix helps you and you want to support its development:
- Buy Me a Coffee: https://buymeacoffee.com/quasistatic
- Ko-fi: https://ko-fi.com/quasistatic
RemoteMouseFix is an independent project and is not affiliated with, endorsed by or sponsored by Blizzard Entertainment or TeamViewer. World of Warcraft, TeamViewer and all other product names are trademarks of their respective owners and are used here only to describe the setups that were measured.
MIT, see LICENSE.

