Windows系统下将窗口移动至鼠标位置或指定坐标的工具及相关API咨询
Windows系统下将窗口移动至鼠标位置或指定坐标的工具及相关API咨询
首先给你几个实用的解决方案,从最简单的自带操作到工具、API都有:
一、Windows自带的快捷操作(无需额外工具)
这个方法很多人都不知道,完全不需要装任何东西就能找回不在可见区域的窗口:
- 先点击任务栏上的目标窗口,确保它是当前激活的窗口
- 按住 Alt + 空格键,会弹出窗口的控制菜单
- 按下 M 键(选择“移动”选项)
- 现在你可以用键盘方向键移动窗口,直到它出现在可见区域;或者直接点击鼠标左键,拖动窗口到你想要的位置
- 松开鼠标或按下Enter键确认位置
二、第三方工具推荐
1. AutoHotkey 自定义脚本
如果经常遇到这个问题,用AutoHotkey写个小脚本绑定快捷键,就能一键搞定,灵活性拉满:
比如下面两个实用脚本:
- 将激活窗口移到鼠标位置(绑定Win+Shift+M):
#Shift::M { ; 获取当前激活窗口的句柄 WinGet, activeWinID, ID, A ; 获取鼠标当前屏幕坐标 MouseGetPos, mouseX, mouseY ; 移动窗口到鼠标位置,保持原有尺寸 WinMove, ahk_id %activeWinID%, , %mouseX%, %mouseY% return }
- 将激活窗口移到主屏幕左上角(绑定Win+Shift+0):
#Shift::0 { WinGet, activeWinID, ID, A ; 直接移到主屏幕(0,0)位置 WinMove, ahk_id %activeWinID%, , 0, 0 return }
使用方法:安装AutoHotkey后,把代码保存为.ahk文件,双击运行即可,以后按对应的快捷键就生效。
2. DisplayFusion
这是一款专门的多屏管理工具,除了窗口移动,还能设置窗口吸附、多屏壁纸等功能。它有个“Move Window to Current Monitor”的选项,一键就能把窗口移到你当前鼠标所在的屏幕,非常适合多屏用户。
3. Window Mover
轻量级的小工具,打开后会列出所有当前运行的窗口,你可以直接选择目标窗口,然后输入坐标或者选择屏幕,一键移动窗口到指定位置,操作简单直观。
三、Windows API 实现思路
如果你想自己开发工具,核心用到以下几个Windows API:
1. 获取窗口句柄
GetForegroundWindow():获取当前激活的窗口句柄(适合用户点击任务栏后的场景)FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName):根据窗口类名或标题查找窗口句柄EnumWindows():枚举所有顶层窗口,适合批量处理的场景
2. 获取鼠标坐标
GetCursorPos(LPPOINT lpPoint):获取鼠标当前的屏幕坐标,返回的POINT结构体包含X、Y值
3. 移动窗口
MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint):直接设置窗口的位置和大小,参数里X/Y是目标坐标,nWidth/nHeight可以用GetWindowRect()获取窗口原有尺寸,bRepaint设为TRUE让窗口重绘SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags):更灵活的窗口位置设置,可以控制窗口层级、是否重绘等,比如用SWP_NOSIZE参数保持窗口原有大小
简单C++示例片段
#include <windows.h> // 将窗口移到鼠标位置 void MoveWindowToMouse(HWND hWnd) { POINT cursorPos; GetCursorPos(&cursorPos); // 获取鼠标坐标 RECT winRect; GetWindowRect(hWnd, &winRect); // 获取窗口当前尺寸 // 移动窗口,保持原有宽高 MoveWindow(hWnd, cursorPos.x, cursorPos.y, winRect.right - winRect.left, winRect.bottom - winRect.top, TRUE); } // 将窗口移到主屏幕左上角 void MoveWindowToMainScreen(HWND hWnd) { // 获取主显示器信息 HMONITOR hPrimaryMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTOPRIMARY); MONITORINFO monitorInfo{}; monitorInfo.cbSize = sizeof(MONITORINFO); GetMonitorInfo(hPrimaryMonitor, &monitorInfo); RECT winRect; GetWindowRect(hWnd, &winRect); // 移到主屏幕左上角 MoveWindow(hWnd, monitorInfo.rcMonitor.left, monitorInfo.rcMonitor.top, winRect.right - winRect.left, winRect.bottom - winRect.top, TRUE); }
备注:内容来源于stack exchange,提问作者KulaGGin
相关产品推荐
相关产品推荐

