Skip to content

About

Portable Windows tool that fixes mouse and camera jumps in 3D games played over remote-control software such as TeamViewer

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

RemoteMouseFix

Build

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.

What the correction changes

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.

Correction off Correction absolute
Camera jumping while the correction is off Camera turning smoothly with the absolute correction
The injected absolute pointer overwrites the game's cursor warp, so the camera jumps and overshoots. The warp stays intact and the remote pointer movement reaches the game as a smooth turn.

Download and quick start

  1. Open the latest release and download the Windows x64 ZIP from Assets.
  2. Extract the complete ZIP into a normal folder. Do not run the EXE from inside the ZIP.
  3. Check RemoteMouseFix.ini beside the EXE. The default Executable=Wow.exe works for any installed WoW executable with that filename. You can instead select one exact installation by its full path; see Target selection.
  4. Start WoW normally, without administrator rights, and connect through TeamViewer.
  5. Double-click Start-Playing.cmd and leave its console window open while playing. Use Ctrl+Alt+C to 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.

Windows warnings on first start

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.zip

If 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.

What the console window shows

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.

Target selection: RemoteMouseFix.ini

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.exe

The 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.

Controls

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.

Does it apply to my setup?

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.

Report a problem or test another setup

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.

  1. Start the game and move to a quiet, safe location.
  2. Double-click Start-AB-Test.cmd from the RemoteMouseFix folder.
  3. Confirm that the console names config-ab-test.json, that TARGET shows the executable from [AB-Test] in RemoteMouseFix.ini, and that FIX is on with absolute. TARGET turns green when you click into the chosen application.
  4. Test the same actions in each mode: absolute, off, then relative. Use Ctrl+Alt+1, Ctrl+Alt+C and Ctrl+Alt+2 to select the modes.
  5. Before every action, press Ctrl+Alt+M to 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.
  6. Note for each mode whether the camera is smooth, jumps, or moves too fast or too slowly.
  7. Press Ctrl+Alt+C, then Ctrl+Alt+Q.
  8. Open the newest file in logs-ab and check that its final lines report queue drops 0 and watchdog trips 0.
  9. 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.

How the correction works

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:

  1. withholds injected mouse-move events from another program so the game's warp stays intact;
  2. calculates how far the remote pointer itself moved;
  3. sends that movement back to the game in a marked SendInput event.

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.

Correction modes

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.

Safety and privacy properties

  • The plain RemoteMouseFix.exe uses config.json, which is diagnostic-only and cannot enable correction.
  • Start-Playing.cmd and Start-AB-Test.cmd explicitly select profiles that permit correction and start in absolute mode.
  • Ctrl+Alt+C switches 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. RegisterHotKey can observe only the documented hotkeys.
  • Input outside the configured target application is discarded before it is logged.

Requirements

  • 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.

Configuration

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.

Build from source

MSVC (preferred)

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 Release

The result in build\bin\Release contains RemoteMouseFix.exe, MouseLookProbe.exe, all three configuration profiles and both .cmd launchers.

Cross-compile from WSL or Linux

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 -j

For 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.

Check whether input reaches the game

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.

Developer test with MouseLookProbe

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.

Project layout

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

Contributing

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.

Support

If RemoteMouseFix helps you and you want to support its development:

Trademarks

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.

License

MIT, see LICENSE.

About

Portable Windows tool that fixes mouse and camera jumps in 3D games played over remote-control software such as TeamViewer

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages