小能豆

c++如何获取鼠标在控制窗口的窗口中位置?

javascript

c中为啥这个检测鼠标在dev-c的运行窗口中点击同一位置从dev-c++中运行出来窗口直接点的和在它运行好的.exe文件窗口中运行的结果不一样呢。下面是我的代码,我就是按照点我这个网址的做的

#include <windows.h>  
#include <bits/stdc++.h>

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
void fun(string s){
    for(int i=0;i<s.size();i++){
        std::cout<<s[i];
        Sleep(3);
    }
} 
int color(int c)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); 
    return 0;
}
void gotoxy(HANDLE hout,int x,int y){
    COORD pos;
    pos.X=x;
    pos.Y=y;
    SetConsoleCursorPosition(hout,pos);
}
POINT p;
HWND h=GetForegroundWindow();
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
void zhuyemian(HANDLE hout){
    color(14);
    int i,j;
    for(i=3;i<=26;i++){
        for(j=22;j<=90;j++)
        {
            gotoxy(hout,j,i);
            if(i==3||i==26)
            {
                cout << "-";
            }
            else if(j==22||j==90)
            {
                cout << "|";
            }
        }
    }

    gotoxy(hout,30,8);
    cout<< "用";

}
int main() {
    zhuyemian(hout);
    while(1) {                              
        if(KEY_DOWN(VK_LBUTTON)) { 
            POINT p;
            GetCursorPos(&p);
            ScreenToClient(h,&p);               //获取鼠标在窗口上的位置
            printf("key down (%d,%d)\n",p.x,p.y);
        }
        Sleep(100);   
    }
    return 0;
}


下面这个是在dev-c++中直接运行源代码出来的(我点击了“用”这个字)

img

下面这个是在它之前编译过的.exe文件中运行的(依然点击了“用”这个字)
img


阅读 58

收藏
2024-06-17

共1个答案

小能豆

你在Dev-C中运行程序时和在生成的.exe文件中运行程序时,检测鼠标位置的结果不一致,这可能是因为窗口的不同行为和属性导致的。特别是在开发环境(如Dev-C)中运行时,窗口和鼠标坐标可能受IDE自身窗口的影响,而独立运行的.exe文件不会有这种影响。具体原因包括以下几点:

  1. 窗口坐标系的差异
  2. 在Dev-C++中运行时,窗口坐标系可能受到IDE窗口的影响,导致坐标偏移。
  3. 独立运行的.exe文件则直接与桌面坐标系对应。

  4. 窗口焦点和前景窗口

  5. GetForegroundWindow()函数可能在Dev-C++中运行时返回的是IDE的窗口句柄,而不是你的程序窗口句柄,这会导致坐标转换的误差。
  6. 独立运行时,前景窗口就是你的程序窗口,坐标转换会更准确。

为了确保一致性,你可以尝试以下修改:

修改1:明确获取窗口句柄

确保你获取的窗口句柄是你程序的窗口,而不是Dev-C++的窗口。

#include <windows.h>  
#include <bits/stdc++.h>

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;

void fun(string s){
    for(int i=0;i<s.size();i++){
        std::cout<<s[i];
        Sleep(3);
    }
} 

int color(int c)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); 
    return 0;
}

void gotoxy(HANDLE hout, int x, int y){
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(hout, pos);
}

void zhuyemian(HANDLE hout){
    color(14);
    int i, j;
    for(i = 3; i <= 26; i++){
        for(j = 22; j <= 90; j++){
            gotoxy(hout, j, i);
            if(i == 3 || i == 26){
                cout << "-";
            } else if(j == 22 || j == 90){
                cout << "|";
            }
        }
    }

    gotoxy(hout, 30, 8);
    cout << "用";
}

int main() {
    HWND consoleWindow = GetConsoleWindow();  // 获取控制台窗口句柄
    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);

    zhuyemian(hout);

    while(1) {                              
        if(KEY_DOWN(VK_LBUTTON)) { 
            POINT p;
            GetCursorPos(&p);
            ScreenToClient(consoleWindow, &p);  // 获取鼠标在控制台窗口上的位置
            printf("key down (%d,%d)\n", p.x, p.y);
        }
        Sleep(100);   
    }
    return 0;
}

修改2:调试输出窗口句柄

为了确认你获取的窗口句柄是否正确,可以添加一些调试输出,查看窗口句柄。

#include <windows.h>  
#include <bits/stdc++.h>

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;

void fun(string s){
    for(int i=0;i<s.size();i++){
        std::cout<<s[i];
        Sleep(3);
    }
} 

int color(int c)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); 
    return 0;
}

void gotoxy(HANDLE hout, int x, int y){
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(hout, pos);
}

void zhuyemian(HANDLE hout){
    color(14);
    int i, j;
    for(i = 3; i <= 26; i++){
        for(j = 22; j <= 90; j++){
            gotoxy(hout, j, i);
            if(i == 3 || i == 26){
                cout << "-";
            } else if(j == 22 || j == 90){
                cout << "|";
            }
        }
    }

    gotoxy(hout, 30, 8);
    cout << "用";
}

int main() {
    HWND consoleWindow = GetConsoleWindow();  // 获取控制台窗口句柄
    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);

    zhuyemian(hout);

    cout << "Console Window Handle: " << consoleWindow << endl;

    while(1) {                              
        if(KEY_DOWN(VK_LBUTTON)) { 
            POINT p;
            GetCursorPos(&p);
            ScreenToClient(consoleWindow, &p);  // 获取鼠标在控制台窗口上的位置
            printf("key down (%d,%d)\n", p.x, p.y);
        }
        Sleep(100);   
    }
    return 0;
}

通过这些修改,你可以确保你的程序在不同环境下获取正确的窗口句柄和鼠标坐标。希望这些建议能解决你的问题。

2024-06-17