C++获取窗口坐标并移动窗口

获取窗口坐标之后,我们就可以移动窗口了,就可以做到一些神奇的事情

HWND hwnd是窗口句柄,我们要获取它

RECT rect是窗口坐标的结构体

GetWindowRect(hwnd,&rect);获取指定窗口坐标

MoveWindow()里面很麻烦,看下面代码

下面是代码

注意:窗口移动单位是像素

#include <windows.h> 
   
#define SHAKE 5
   
void ShakeWindow(){ 
    RECT rect; 
    HWND hwnd=GetForegroundWindow();
    GetWindowRect(hwnd,&rect); 
    MoveWindow(hwnd,rect.left+SHAKE,rect.top,rect.right-rect.left,rect.bottom-rect.top,TRUE); 
    Sleep(28); 
    MoveWindow(hwnd,rect.left+SHAKE,rect.top-SHAKE,rect.right-rect.left,rect.bottom-rect.top,TRUE); 
    Sleep(28); 
    MoveWindow(hwnd,rect.left,rect.top-SHAKE,rect.right-rect.left,rect.bottom-rect.top,TRUE); 
    Sleep(28); 
    MoveWindow(hwnd,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,TRUE); 
}
   
int main(){
    while(1) {
        ShakeWindow();
        Sleep(20);
    }
    
    return 0; 
} 
 


  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要实现拖动窗口主体可移动,可以使用以下步骤: 1. 在窗口的消息处理函数中,处理 WM_NCHITTEST 消息,检测鼠标是否在窗口的非客户区(边框、标题栏等)。 2. 如果鼠标在非客户区,则返回 HTCAPTION,表示鼠标操作会影响窗口的位置。 3. 处理 WM_LBUTTONDOWN 消息,当鼠标左键按下时,记录鼠标的位置和窗口的位置。 4. 处理 WM_MOUSEMOVE 消息,当鼠标移动时,计算鼠标的移动距离,然后按照鼠标的移动距离,更新窗口的位置。 以下是一个示例代码: ``` LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static POINTS lastMousePos; static POINTS lastWindowPos; switch (msg) { case WM_NCHITTEST: { // 检测鼠标是否在窗口的非客户区 RECT rc; GetWindowRect(hwnd, &rc); POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; if (!PtInRect(&rc, pt)) { return HTCAPTION; } break; } case WM_LBUTTONDOWN: { // 记录鼠标和窗口的位置 lastMousePos = MAKEPOINTS(lParam); GetWindowRect(hwnd, &rc); lastWindowPos.x = rc.left; lastWindowPos.y = rc.top; break; } case WM_MOUSEMOVE: { // 计算鼠标的移动距离,并更新窗口的位置 if (wParam & MK_LBUTTON) { POINTS curMousePos = MAKEPOINTS(lParam); int dx = curMousePos.x - lastMousePos.x; int dy = curMousePos.y - lastMousePos.y; SetWindowPos(hwnd, NULL, lastWindowPos.x + dx, lastWindowPos.y + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } break; } // 其他消息处理 } return DefWindowProc(hwnd, msg, wParam, lParam); } ``` 这样就可以实现拖动窗口主体可移动了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值