首页
社区
课程
招聘
这个BC++代码用Delphi应该怎么写?
发表于: 2006-11-13 11:18 6554

这个BC++代码用Delphi应该怎么写?

2006-11-13 11:18
6554
遇到了点麻烦:)大家帮看下

void __fastcall TMainForm::TimerTimer(TObject *Sender)
{
    POINT Posion1,Posion2;
    HANDLE HintHandle;                  
    GetGameHandle();

    HintHandle = FindWindow(NULL, "提示信息");     
    if (HintHandle)
    {
      if (GameWindows)
      {                                
        PostMessage(GameWindows,WM_LBUTTONDOWN,0,(LPARAM)MAKELPARAM(745,565));
        PostMessage(GameWindows,WM_LBUTTONUP,0,(LPARAM)MAKELPARAM(745,565));
      }
      else
      {                              
        keybd_event(13,0,0,0);
        keybd_event(13,0,KEYEVENTF_KEYUP,0);
      }
    }

    if (!GameWindows && (GetTickCount()-StartTime>5000) && (StartHandle->Text!="") )
    {
        HANDLE sh;
        sh=(HANDLE)StrToInt(StartHandle->Text);
//        PostMessage(sh,WM_COMMAND, 0,0 );
        PostMessage(sh,WM_LBUTTONDOWN,0,(LPARAM)MAKELPARAM(1,1));
        PostMessage(sh,WM_LBUTTONUP,0,(LPARAM)MAKELPARAM(1,1));
        StartTime = GetTickCount();
    }

    if(GetOnePairs(Posion1,Posion2))
    {
        if(AutoHint->Checked)
        {
            PaintBox(Posion1.y,Posion1.x);
            PaintBox(Posion2.y,Posion2.x);
        }
        if(AutoRun->Checked)
        {
            PostMessage(GameWindows,WM_LBUTTONDOWN,0,(LPARAM)MAKELPARAM(GAME_LEFT+48*Posion1.y+22,GAME_TOP+48*Posion1.x+22));
            PostMessage(GameWindows,WM_LBUTTONUP,0,(LPARAM)MAKELPARAM(GAME_LEFT+48*Posion1.y+22,GAME_TOP+48*Posion1.x+22));
            PostMessage(GameWindows,WM_LBUTTONDOWN ,0,(LPARAM)MAKELPARAM(GAME_LEFT+48*Posion2.y+22,GAME_TOP+48*Posion2.x+22));
            PostMessage(GameWindows,WM_LBUTTONUP,0,(LPARAM)MAKELPARAM(GAME_LEFT+48*Posion2.y+22,GAME_TOP+48*Posion2.x+22));
        }
    }
    if(UseTool->Checked)
    {
        switch(CheckEquipment())
        {
            case 0:     
                break;
            case 1:     
                keybd_event('1',0,0,0);
                keybd_event('1',0,KEYEVENTF_KEYUP,0);
                break;
            case 2:     
                keybd_event('1',0,0,0);
                keybd_event('1',0,KEYEVENTF_KEYUP,0);
                break;
            case 3:     
                keybd_event('1',0,0,0);
                keybd_event('1',0,KEYEVENTF_KEYUP,0);
                break;
            case 4:     
                keybd_event((char)(random(3)+2+'0'),0,0,0);
                keybd_event((char)(random(3)+2+'0'),0,KEYEVENTF_KEYUP,0);
                break;
            case 5:     
                keybd_event((char)(random(3)+2+'0'),0,0,0);
                keybd_event((char)(random(3)+2+'0'),0,KEYEVENTF_KEYUP,0);
                break;
            case 6:     
                keybd_event((char)(random(3)+2+'0'),0,0,0);
                keybd_event((char)(random(3)+2+'0'),0,KEYEVENTF_KEYUP,0);
                break;
            case 7:     
                keybd_event((char)(random(3)+2+'0'),0,0,0);
                keybd_event((char)(random(3)+2+'0'),0,KEYEVENTF_KEYUP,0);
                break;
            case 8:     
                keybd_event((char)(random(3)+2+'0'),0,0,0);
                keybd_event((char)(random(3)+2+'0'),0,KEYEVENTF_KEYUP,0);
                break;
            case 0xFF:  
                keybd_event('d',0,0,0);
                keybd_event('d',0,KEYEVENTF_KEYUP,0);
                break;
            default: break;
        }
    }
    if(AutoStart->Checked)
    {
        if(GetStartButton())
        {
            if(++TimeCount>(2000/Timer->Interval))
            {
                PostMessage(GameWindows,WM_LBUTTONDOWN,0,(LPARAM)MAKELPARAM(600,565));
                PostMessage(GameWindows,WM_LBUTTONUP,0,(LPARAM)MAKELPARAM(600,565));
                TimeCount = 0;
            }
        }
        else
            TimeCount = 0;
    }
}
if(GetOnePairs(Posion1,Posion2)) //GetOnePairs返回布尔值
{
if(AutoHint->Checked)
{
PaintBox(Posion1.y,Posion1.x);
PaintBox(Posion2.y,Posion2.x);
}


特别是这里比较奇怪,Posion1,Posion2只是在这个函数里的局部变量,但是下面又多了个Posion1.y,Posion1.x和Posion2.y,Posion2.x,这4个参数就完全不知道怎么来的

另外就是PostMessage函数转换不过来

兄弟们看看

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
2
typedef struct tagPOINT
{
    LONG  x;
    LONG  y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
2006-11-13 11:38
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
PostMessage可以这样转换:如
PostMessage(GameWindows,WM_LBUTTONUP,0,(LPARAM)MAKELPARAM(600,565));
转换成:
PostMessage(GameWindows,WM_LBUTTONUP,0,600 or (565 shl 16));
2006-11-13 12:01
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
4
最初由 shoooo 发布
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;

谢谢哦`
这个我后来装上BC++调用看到的
原来是我的数据类型不对应
2006-11-13 12:12
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
5
最初由 小虾 发布
PostMessage可以这样转换:如
PostMessage(GameWindows,WM_LBUTTONUP,0,(LPARAM)MAKELPARAM(600,565));
转换成:
PostMessage(GameWindows,WM_LBUTTONUP,0,600 or (565 shl 16));


谢谢 果然可以
不过有点不明白的

(LPARAM)MAKELPARAM(600,565))和600 or (565 shl 16)为啥是等价的?
我查了半天MSDN都没见说明
2006-11-13 12:17
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
MAKELPARAM是一个宏,他的定义就是这样运算的。
#define MAKELPARAM(l,h) (l | (h << 16))
2006-11-13 12:21
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
7
最初由 小虾 发布
MAKELPARAM是一个宏,他的定义就是这样运算的。
#define MAKELPARAM(l,h) (l | (h << 16))

强人~~感谢ing~
2006-11-13 12:28
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
8
另外
POINT Posion1,Posion2;
是指针类型的么?

bool TMainForm::GetOnePairs(POINT &Area1,POINT &Area2)
BC++中前面加了个&代表啥意思?
2006-11-13 13:25
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
9
POINT是结构类型。C++中函数中的&是指引用参数,在Delphi则是用var表示。
Function TMainForm.GetOnePairs(var Areal,Area2:POINT):BOOL;
2006-11-13 13:46
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
10
最初由 小虾 发布
POINT是结构类型。C++中函数中的&是指引用参数,在Delphi则是用var表示。
Function TMainForm.GetOnePairs(var Areal,Area2:POINT):BOOL;

感谢
我调试了下 Delphi中类应该是TPOINT
Function TMainForm.GetOnePairs(var Areal,Area2:POINT):BOOL;
调试不通过
Function TMainForm.GetOnePairs(var Areal,Area2:TPOINT):BOOL;
才可以 谢谢 小虾
不清楚再来问:)

一堆代码要转。。汗
2006-11-13 14:14
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
11
呵呵,是TPOINT
2006-11-13 14:24
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
12
小虾
HANDLE TMainForm::GetGameHandle(void)
转成
Function TMainForm.GetGameHandle:THandle;
不对么?
2006-11-14 13:42
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
13
对的。。。
2006-11-14 15:39
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
14
有点郁闷。。。
全部转出来了,可以编译
但是功能丢失了。。。
还是自己写好了



另外
procedure Mouseclick(x1,y1,x2,y2:Integer);
var
  po:TPoint;
  Recta:TRect;
begin
    GetWindowRect(GameHandle,Recta);
    GetCursorPos(po);
    SetCursorPos(box[x1,y1].x,box[x1,y1].y);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    SetCursorPos(box[x2,y2].x,box[x2,y2].y);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    SetCursorPos(po.X,po.Y);
end;

鼠标点击事件转化用PostMessages怎么不对了

PostMessage(GameHandle,WM_LBUTTONDOWN,0,MAKELPARAM(box[x1,y1].x,box[x1,y1].y));
PostMessage(GameHandle,WM_LBUTTONUP,0,MAKELPARAM(box[x1,y1].x,box[x1,y1].y));
PostMessage(GameHandle,WM_LBUTTONDOWN,0,MAKELPARAM(box[x2,y2].x,box[x2,y2].y));
PostMessage(GameHandle,WM_LBUTTONUP,0,MAKELPARAM(box[x2,y2].x,box[x2,y2].y));
2006-11-14 16:19
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
15
用mouse_event和使用PostMessage是有区别的。mouse_event不用理会对应那一个窗口,他只需模拟鼠标在当前位置按下鼠标,系统会自动找对应的窗口发送鼠标消息。而PostMessage需要对应窗口句柄,如果你使用的窗口句柄不是程序要处理的,就是你没有找对处理鼠标按下的窗口句柄,程序就不会正确响应你的鼠标事件。
2006-11-14 17:46
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
16
谢谢:)

刚才把自己写的弄好了
然后又回过头去调试翻译的
改了两个地方既然成功了
汗死!
两天两夜没怎么睡 5555
2006-11-14 18:30
0
游客
登录 | 注册 方可回帖
返回