鼠标位置的奇怪问题!
我依次在两个位置按下某个键,键盘钩子会自动纪录这两个位置的坐标(tagPOINTpt;getcursorpos(&pt,纪录pt.x,pt.y))
然后再按某个键,自动依次在这两个位置释放鼠标左键点击消息()setcursorpos(pt.x,pt.y),为什么每次点击的坐标和纪录是的坐标相差有点大呢?
我是把pt.x,pt.y(long)保存在一struct里面。
问题点数:100、回复次数:9Top
1 楼heng2003(哼哼)回复于 2003-12-04 11:14:04 得分 20
代码呢?
Top
2 楼ljianq(泉深水清)回复于 2003-12-04 11:18:34 得分 20
你将坐标都转换为屏幕坐标试试。Top
3 楼heng2003(哼哼)回复于 2003-12-04 11:19:53 得分 40
简单写一个钩子函数
long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam)
{
static TPoint pt; //用静态变量
KBDLLHOOKSTRUCT *key = (KBDLLHOOKSTRUCT*)lParam;
if(key->vkCode == VK_CONTROL||key->vkCode == VK_LCONTROL || key->vkCode == VK_RCONTROL){ //当按下control 键 ,记录鼠标位置
GetCursorPos(&pt);
}
if(key->vkCode == VK_RETURN){
SetCursorPos(pt.x,pt.y); //按下回车,回复记录的鼠标位置
}
return CallNextHookEx(OldHook,code,wParam,lParam);
}Top
4 楼constantine(飘遥的安吉儿)回复于 2003-12-04 11:20:47 得分 20
你要的是什么的坐标啊?说得很不清楚。有没有坐标转换啊,比如是FORM上的到SCREEN
最好有代码看,比较清楚。Top
5 楼vick(古来圣贤皆寂寞,唯有淫贼留其名)回复于 2003-12-04 11:48:24 得分 0
取坐标:
if (mark==1)
{
tagPOINT cpoint;
GetCursorPos(&cpoint);
pcik_struct pos;
pos.xpos = cpoint.x;
pos.ypos = cpoint.y;
pfile = fopen(fname,"r+");
if (pfile == NULL)
{
pfile = fopen(fname,"w+");
fclose(pfile);
pfile = fopen(fname,"r+");
}
fseek(pfile,0L,SEEK_SET );
fwrite(&pos,sizeof(pos),1,pfile);
fclose(pfile);
mark++;
return 1;
}
if (mark==2)
{
tagPOINT cpoint;
GetCursorPos(&cpoint);
pcik_struct pos;
pos.xpos = cpoint.x;
pos.ypos = cpoint.y;
pfile = fopen(fname,"r+");
if (pfile == NULL)
{
pfile = fopen(fname,"w+");
fclose(pfile);
pfile = fopen(fname,"r+");
}
fseek(pfile,sizeof(pos),SEEK_SET );
fwrite(&pos,sizeof(pos),1,pfile);
fclose(pfile);
mark = 0;
return 1;
}
在以上纪录的两个位置依次释放鼠标左键点击信息:
if (mark == 0) //执行秒杀
{
pfile = fopen(fname,"r");
if (pfile==NULL)
{
MessageBox(FindWindow(NULL,NULL),"没有设置参数,请重新设置!","破天一剑秒:",MB_OK);
return 1;
}
pcik_struct pos1,pos2;
fseek(pfile,0L,SEEK_SET);
int temp = fread(&pos1,1,sizeof(pos1),pfile);
if (temp!=sizeof(pos1))
{
MessageBox(FindWindow(NULL,NULL),"读参数出错!","破天一剑秒:",MB_OK);
fclose(pfile);
return 1;
}
fclose(pfile);
pfile = fopen(fname,"r");
if (pfile==NULL)
{
MessageBox(FindWindow(NULL,NULL),"没有设置参数,请重新设置!","破天一剑秒:",MB_OK);
return 1;
}
fseek(pfile,sizeof(pos1),SEEK_SET);
temp = fread(&pos2,1,sizeof(pos2),pfile);
if (temp!=sizeof(pos2))
{
MessageBox(FindWindow(NULL,NULL),"读参数出错!","破天一剑秒:",MB_OK);
fclose(pfile);
return 1;
}
tagPOINT pt;
GetCursorPos(&pt);
Sleep (30);
SetCursorPos(pos1.xpos, pos1.ypos);
//Sleep (30);
//SetCursorPos(280, 527);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Sleep (50);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Sleep (50);
SetCursorPos(pos2.xpos, pos2.ypos);
//SetCursorPos(320, 558);
//Sleep (50);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Sleep (50);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Sleep (30);
SetCursorPos(pt.x, pt.y);
Sleep (30);
return 1;
//MessageBox(FindWindow(NULL,NULL),"ss","a text message from a dll class",MB_OK);
}
Top
6 楼vick(古来圣贤皆寂寞,唯有淫贼留其名)回复于 2003-12-04 11:53:40 得分 0
而且我这个执行纪录、释放左键消息都是在游戏中执行的,我试了一下,在窗口、屏幕情况下都没有问题,但是如果有输入框等一些子控件就会产生偏差。
怎么在屏幕坐标和窗口坐标之间转换?
如果要转换,那么取得游戏窗口的句柄怎么取?Top
7 楼ljlln(阿明)回复于 2003-12-04 16:39:57 得分 0
GetCursorPos(&pt);
ScreenToClient() ;Top
8 楼goneaway1981(当我们踏上征程)回复于 2003-12-06 11:54:42 得分 0
好像是外挂,呵呵~~~~~
Top
9 楼yjy1001(蓝鲸--优秀得郁闷的鱼)回复于 2003-12-06 13:41:54 得分 0
..........外挂?!
可惜身边 没有对游戏感兴趣的家伙,要不 早拉他们开发 外挂去了~!^Q^Top




