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
你在Dev-C中运行程序时和在生成的.exe文件中运行程序时,检测鼠标位置的结果不一致,这可能是因为窗口的不同行为和属性导致的。特别是在开发环境(如Dev-C)中运行时,窗口和鼠标坐标可能受IDE自身窗口的影响,而独立运行的.exe文件不会有这种影响。具体原因包括以下几点:
独立运行的.exe文件则直接与桌面坐标系对应。
窗口焦点和前景窗口:
GetForegroundWindow()
为了确保一致性,你可以尝试以下修改:
确保你获取的窗口句柄是你程序的窗口,而不是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; }
为了确认你获取的窗口句柄是否正确,可以添加一些调试输出,查看窗口句柄。
#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; }
通过这些修改,你可以确保你的程序在不同环境下获取正确的窗口句柄和鼠标坐标。希望这些建议能解决你的问题。