首页
社区
课程
招聘
[旧帖] 用VC6.0写的SetTimer不成功收不到WM_TIMER消息?? 0.00雪花
发表于: 2011-8-7 22:18 7783

[旧帖] 用VC6.0写的SetTimer不成功收不到WM_TIMER消息?? 0.00雪花

2011-8-7 22:18
7783
用VC6.0 SDK方式写的一个基于模式对话框的小程序,应该是定时器工作不正常,请高手把把脉,不胜感激!!
以下为cpp全部源码:

#include "stdafx.h"
#include "resource.h"

#define Timer 1
HINSTANCE hInst;
int hDlg = NULL;
LRESULT DlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
        hInst = hInstance;
        hDlg = DialogBox(hInst, (LPCTSTR)IDD_DIALOG1, NULL,(DLGPROC)DlgProc);  //创建模式对话框
        return 0;  
}

LRESULT DlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
        DWORD xuebuffer1=0;
        DWORD xuebuffer2=0;
        DWORD mobuffer1=0;
        DWORD mobuffer2=0;
        DWORD *xue1=NULL;
        DWORD *xue2=NULL;
        DWORD *mo1=NULL;
        DWORD *mo2=NULL;
        DWORD TraviaPID=0;
        HWND hTraviaWnd=0;
        HANDLE hTraviaProc=0;
    switch(Msg)
    {
    case WM_COMMAND:
                {
                        switch(LOWORD(wParam))
                        {
                        case WM_CREATE:
                                SetTimer(hTraviaWnd, Timer, 1000, NULL);
                        break;
                        case IDC_BUTTON1:
                                hTraviaWnd = FindWindow(NULL, "Travia");
                                GetWindowThreadProcessId(hTraviaWnd, &TraviaPID);
                                hTraviaProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, TraviaPID);
                                ReadProcessMemory(hTraviaProc, (LPCVOID)0x006273F0, &xuebuffer1, 4, NULL);  //读取血量上限
                                ReadProcessMemory(hTraviaProc, (LPCVOID)0x006273E8, &xuebuffer2, 4, NULL);  //读取当前血量
                                ReadProcessMemory(hTraviaProc, (LPCVOID)0x006273F4, &mobuffer1, 4, NULL);  //读取魔量上限
                                ReadProcessMemory(hTraviaProc, (LPCVOID)0x006273EC, &mobuffer2, 4, NULL);  //读取当前魔量
                                xue1=(DWORD *)&xuebuffer1;
                                xue2=(DWORD *)&xuebuffer2;
                                mo1=(DWORD *)&mobuffer1;
                                mo2=(DWORD *)&mobuffer2;
                        break;
                        case WM_TIMER:
                                switch(wParam)
                                {
                                case Timer:
                                        if(*xue2 < *xue1)
                                        {
                                                keybd_event(49,0,0,0);
                                                keybd_event(49,0,KEYEVENTF_KEYUP,0);  //按键1
                                        }
                                        if(*mo2 < *mo1)
                                        {
                                                keybd_event(50,0,0,0);
                                                keybd_event(50,0,KEYEVENTF_KEYUP,0);  //按键2
                                        }
                                }
                        break;
                        }
                }
        break;
    case WM_CLOSE:
        EndDialog(hDlg,TRUE);  //终止模式对话框
        return TRUE;
        break;
    case WM_DESTROY:
                KillTimer(hTraviaWnd,Timer);
                CloseHandle(hTraviaProc);
        PostQuitMessage(0);
        return TRUE;
        break;
    };
    return FALSE;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
2
case WM_CREATE:
        SetTimer(hTraviaWnd, Timer, 1000, NULL);
......
看位置....好好照着书本看看 ,都放错了!
2011-8-7 23:18
0
雪    币: 237
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
SetTimer的时候hTraviaWnd=0

不如放在
     case IDC_BUTTON1:
        hTraviaWnd = FindWindow(NULL, "Travia");
后面

     case IDC_BUTTON1:
        hTraviaWnd = FindWindow(NULL, "Travia");
        SetTimer(hTraviaWnd, Timer, 1000, NULL);
2011-8-8 08:24
0
雪    币: 95
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
Parameters
hWnd Handle to the window to be associated with the timer. This window must be owned by the calling thread. If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored.
2011-8-8 11:00
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
5
有2个地方是错的
1. WM_CREATE 消息与 WM_COMMAND 是平级的。
2. 对话框接收不到 WM_CREATE消息。
2011-8-8 14:15
0
雪    币: 209
活跃值: (808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢以上大牛们的解答!!
还有一个问题:
ReadProcessMemory读到的游戏数值怎么进行比较??
ReadProcessMemory(hTraviaProc, (LPCVOID)0x006273F0, &xuebuffer1, 4, NULL);  //读取血量上限
ReadProcessMemory(hTraviaProc, (LPCVOID)0x006273E8, &xuebuffer2, 4, NULL);  //读取当前血量

第三个参数是本地存放读取数据的内存地址,好像是个指针,怎么比较xuebuffer1和xuebuffer2里的值,具体代码怎么写?
就如:
if (xuebuffer2里的值 < xuebuffer1里的值)
{
//执行加血动作
}
2011-8-9 15:22
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
xuebuffer1和xuebuffer2都是Dword型的变量,直接比较就行了吧。

if(xuebuffer1 < xuebuffer2)
{
     //执行加血
}

“&xuebuffer1”是传引用。
2011-8-9 15:39
0
雪    币: 209
活跃值: (808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好像xuebuffer1和xuebuffer2都是一个地址啊?
我是想要比较这两个地址里的值啊!
呵呵!
2011-8-9 16:09
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
keybd_event(49,0,0,0);
            keybd_event(49,0,KEYEVENTF_KEYUP,0);  //按键1

这种写法很不好  一旦你当前窗口变成别的时候  就会出问题
这个建议还是用sendmessage
2011-8-9 16:46
0
游客
登录 | 注册 方可回帖
返回
//