首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Windows SendInput 絕對座標標準化:65535 (0xFFFF) 代表 16 位無符號整數最大值

     編輯:程式設計綜合問答

公式來源

INPUT input = {0};
input.type = INPUT_MOUSE;
input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
input.mi.dx = (65535 * x) / screenWidth;
input.mi.dy = (65535 * y) / screenHeight;
SendInput(1, &input, sizeof(INPUT));

為什麼是 65535?

  • 65535 = 0xFFFF = 2^16 - 1,為 **16 位無符號整數最大值**。
  • Windows 將螢幕座標**標準化**到 [0, 65535] 區間,對應 0% ~ 100% 位置。
  • 此設計使 SendInput **與解析度無關**:無論螢幕 1920x1080 或 3840x2160,同樣的 dx=32767 皆代表水平中點。
  • 驅動程式/硬體層再根據實際解析度換算為物理像素。

注意事項

  • 多螢幕環境:screenWidth、screenHeight 應為**虛擬螢幕總尺寸**(GetSystemMetrics(SM_CXVIRTUALSCREEN))。
  • 高 DPI:若進程非 DPI 感知,座標會被縮放;建議清單設定 dpiAware 或呼叫 SetProcessDPIAware()。
  • 精度:16 位對 4K 螢幕(3840)約 0.058 像素/單位,足夠精確。

替代方案

若需像素級精確控制,可用 MOUSEEVENTF_MOVE(相對移動)搭配 GetCursorPos 計算差值,避免標準化轉換誤差。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved