zoukankan      html  css  js  c++  java
  • 悬浮可拖动的控制台窗体

    2020年5月18日第一次更新:两个窗口重叠时会同时移动,解决这个小问题!

    函数:WindowFromPoin

    功能为获取坐标结构下的窗口句柄,这里判断是否是自己窗口的句柄就能知道是否在窗体内

    于是就不需要之前的坐标判断了,直接用函数判断句柄 hwnd==WindowFromPoint(xy)

    不知道哪个方法速度快呢?

    #include <windows.h>
    //#include <winuser.h>
    #include <stdio.h>
    
    DWORD WINAPI T_move(LPVOID lpParam){
        POINT xy,xy2;
        RECT rect;
        HANDLE hwnd=GetConsoleWindow();
    while(1)
    {//============================================= 
        Sleep(33);
        
        if(GetAsyncKeyState(1)){
            GetCursorPos(&xy);
            GetWindowRect(hwnd,&rect);
            if(hwnd==WindowFromPoint(xy)){
                xy2.x=xy.x-rect.left;
                xy2.y=xy.y-rect.top;
                while(GetAsyncKeyState(1)){
                Sleep(16);
                GetCursorPos(&xy);
                SetWindowPos(hwnd,HWND_TOPMOST,xy.x-xy2.x,xy.y-xy2.y,0,0,SWP_NOSIZE);
                }
            }
            else{
                while(GetAsyncKeyState(1)){
                    Sleep(33);
                }
            }
                
        }        
    }//============================================= 
    } 
    
    void mmain(){
        SetWindowPos(GetConsoleWindow(),HWND_TOPMOST,0,0,600,600,SWP_NOMOVE);
        SetWindowLongPtrA(
            GetConsoleWindow(),
            GWL_STYLE,
            GetWindowLongPtrA(GetConsoleWindow(),GWL_STYLE)
            & ~ WS_CAPTION & ~ WS_SIZEBOX
        );
        HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);  
        DWORD mode;  
        GetConsoleMode(hStdin,&mode);  
        mode&= ~ ENABLE_QUICK_EDIT_MODE;
        mode&= ~ ENABLE_INSERT_MODE;
        mode&= ~ ENABLE_MOUSE_INPUT;
        SetConsoleMode(hStdin,mode);
    }
    int main(void){
        CreateThread(NULL,0,&T_move,0,0,0);
        mmain();
        
        while(1){
            Sleep(100);
        
        }
    
    }

    废话少说,直接上源码,使用时调用那个函数就好啦!

    不过拖动操作是多线程监控的,建议直接套用整个源码。

    #include <windows.h>
    //#include <winuser.h>//这里注释掉是为了兼容TDM编译
    #include <stdio.h>
    
    DWORD WINAPI T_move(LPVOID lpParam){
        POINT xy,xy2;
        RECT rect;
        HANDLE hwnd=GetConsoleWindow();
    while(1)
    {//============================================= 
        Sleep(33);
        
        if(GetAsyncKeyState(1)){
            GetCursorPos(&xy);
            GetWindowRect(hwnd,&rect);
            if(xy.x>rect.left && xy.x<rect.right && xy.y>rect.top && xy.y<rect.bottom){
                xy2.x=xy.x-rect.left;
                xy2.y=xy.y-rect.top;
                while(GetAsyncKeyState(1)){
                Sleep(16);
                GetCursorPos(&xy);
                SetWindowPos(hwnd,HWND_TOPMOST,xy.x-xy2.x,xy.y-xy2.y,0,0,SWP_NOSIZE);
                }
            }
            else{
                while(GetAsyncKeyState(1)){
                    Sleep(33);
                }
            }
                
        }        
    }//============================================= 
    } 
    
    void mmain(){
        SetWindowPos(GetConsoleWindow(),HWND_TOPMOST,0,0,600,600,SWP_NOMOVE);
        SetWindowLongPtrA(
            GetConsoleWindow(),
            GWL_STYLE,
            GetWindowLongPtrA(GetConsoleWindow(),GWL_STYLE)
            & ~ WS_CAPTION & ~ WS_SIZEBOX
        );
        HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);  
        DWORD mode;  
        GetConsoleMode(hStdin,&mode);  
        mode&= ~ ENABLE_QUICK_EDIT_MODE;
        mode&= ~ ENABLE_INSERT_MODE;
        mode&= ~ ENABLE_MOUSE_INPUT;
        SetConsoleMode(hStdin,mode);
    }
    int main(void){
        CreateThread(NULL,0,&T_move,0,0,0);
        mmain();
        
        while(1){
            Sleep(100);
        }
    
    }
  • 相关阅读:
    java io 学习笔记(一)
    Centos中查看系统信息的常用命令
    arcgis影像批量裁剪代码
    VS2010中VC++目录和C/C++之间的区别。VC++ Directories和C/C++的区别。
    VS中为什么不同的项目类型属性查看和设置的界面不一样
    C++函数中返回引用和返回值的区别
    java中HashMap的keySet()和values()
    repoquery详解——linux查看包依赖关系的神器
    linux学习笔记
    log4j的AppenderLayout格式符
  • 原文地址:https://www.cnblogs.com/pta00/p/12883058.html
Copyright © 2011-2022 走看看