首页
社区
课程
招聘
鼠标消息相关问题
发表于: 2015-1-1 10:23 5880

鼠标消息相关问题

2015-1-1 10:23
5880
本人想做一个游戏的辅助程序,现在需要模拟鼠标点击消息,已知SendMessage PostMessage消息都无法使用。
Keybd_event/mouse_event是可以正常工作的。但是有个问题,只能对当前活动的窗口有效,这样就无法多开。
网上找了好多资料,都不十分明白。
有的说是用DirectInput模拟鼠标,这是网上找的代码。

/***************************************************************************************
PURPOSE:
Mouse device Demo
***************************************************************************************/

#define DIRECTINPUT_VERSION 0x0800

#include <windows.h>
#include <stdio.h>
#include <dinput.h>
#include "resource.h"

#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dinput8.lib")

#pragma warning(disable : 4996)

#define Safe_Release(p) if((p)) (p)->Release();

// window handles, class and caption text.
HWND g_hwnd;
char g_class_name[] = "MouseClass";

IDirectInput8* g_directinput;               // directinput component
IDirectInputDevice8* g_directinput_device;  // mouse device

//--------------------------------------------------------------------------------
// Window procedure.
//--------------------------------------------------------------------------------
long WINAPI Window_Proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}

	return (long)DefWindowProc(hwnd, msg, wParam, lParam);
}

//--------------------------------------------------------------------------------
// Initialize mouse interface, return a mouse interface pointer.
//--------------------------------------------------------------------------------
IDirectInputDevice8* Init_Mouse(HWND hwnd, IDirectInput8* directinput)
{
	IDirectInputDevice8* directinput_device;

	// create the device object
	if (FAILED(directinput->CreateDevice(GUID_SysMouse, &directinput_device, NULL)))
		return NULL;

	// set the data format
	if (FAILED(directinput_device->SetDataFormat(&c_dfDIMouse)))
	{
		directinput_device->Release();
		return NULL;
	}

	// set the coooperative mode
	if (FAILED(directinput_device->SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
	{
		directinput_device->Release();
		return NULL;
	}

	// acquire the device for use
	if (FAILED(directinput_device->Acquire()))
	{
		directinput_device->Release();
		return NULL;
	}

	// everything well, so return a vaild pointer.
	return directinput_device;
}

//--------------------------------------------------------------------------------
// Read mouse buffer.
//--------------------------------------------------------------------------------
BOOL Read_Device(IDirectInputDevice8* directinput_device, void* buffer, long buffer_size)
{
	HRESULT rv;

	while (1)
	{
		// poll device
		g_directinput_device->Poll();

		// read in state
		if (SUCCEEDED(rv = g_directinput_device->GetDeviceState(buffer_size, buffer)))
			break;

		// return when an unknown error
		if (rv != DIERR_INPUTLOST || rv != DIERR_NOTACQUIRED)
			return FALSE;

		// re-acquire and try again
		if (FAILED(g_directinput_device->Acquire()))
			return FALSE;
	}

	return TRUE;
}

//--------------------------------------------------------------------------------
// Main function, routine entry.
//--------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
{
	WNDCLASS        win_class;
	MSG             msg;
	DIMOUSESTATE    mouse_state = { 0 };
	char            text[256];
	long            x_pos = 0, y_pos = 0;

	// create window class and register it
	win_class.style = CS_HREDRAW | CS_VREDRAW;
	win_class.lpfnWndProc = Window_Proc;
	win_class.cbClsExtra = 0;
	win_class.cbWndExtra = DLGWINDOWEXTRA;
	win_class.hInstance = inst;
	win_class.hIcon = LoadIcon(inst, IDI_APPLICATION);
	win_class.hCursor = LoadCursor(NULL, IDC_ARROW);
	win_class.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
	win_class.lpszMenuName = NULL;
	win_class.lpszClassName = g_class_name;

	if (!RegisterClass(&win_class))
		return FALSE;

	// create the main window
	g_hwnd = CreateDialog(inst, MAKEINTRESOURCE(IDD_MOUSE), 0, NULL);

	ShowWindow(g_hwnd, cmd_show);
	UpdateWindow(g_hwnd);

	// initialize directinput and get keyboard device
	DirectInput8Create(inst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void **)&g_directinput, NULL);

	// initialize mouse
	g_directinput_device = Init_Mouse(g_hwnd, g_directinput);

	// start message pump, waiting for signal to quit.
	ZeroMemory(&msg, sizeof(MSG));

	while (msg.message != WM_QUIT)
	{
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

		// read in mouse and display coordinates
		Read_Device(g_directinput_device, &mouse_state, sizeof(DIMOUSESTATE));

		x_pos += mouse_state.lX;
		y_pos += mouse_state.lY;

		if (mouse_state.lX != 0 || mouse_state.lY != 0)
		{
			sprintf(text, "%ld, %ld", x_pos, y_pos);
			SetWindowText(GetDlgItem(g_hwnd, IDC_COORDINATES), text);
		}
	}

	// release directinput objects
	g_directinput_device->Unacquire();
	g_directinput_device->Release();
	g_directinput->Release();

	UnregisterClass(g_class_name, inst);

	return (int)msg.wParam;
}


但还不十分理解,貌似是“获取”鼠标信息,但是怎么“写入”信息呢,也就是点击,自己好久都没有推敲出来。
请此中高手指点一二,思路即可。

还有,这个问题能不能用全局的鼠标钩子解决?也请指点。。。

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

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用大漠插件多好
2015-1-1 13:34
0
雪    币: 157
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
呵呵,目前是在用dm,但是想自力更生,也想长点知识
2015-1-1 13:51
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个代码只是读鼠标坐标并显示出来吧...没有模拟点击代码
2015-1-1 14:02
0
雪    币: 157
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那要怎么模拟点击呢?
2015-1-1 14:10
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
同问。
一些程序的窗口像是画出来的,根本没有控件,无法模拟消息。
2015-1-1 16:10
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
没试过模拟点击, 只做过模拟键盘, 如果不是固定窗口坐标不好分析吧, 建议直接找Call
2015-1-1 16:15
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
以前分析过一个游戏的鼠标操作, 游戏内部分析点击的坐标是对像还是按钮,然后分支执行相应操作,
2015-1-1 16:24
0
雪    币: 157
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不太会再内存,再说也不会过保护和检测,所以还是模拟按键比较靠谱
2015-1-1 16:58
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
send/postmessage被屏蔽的话,除了全局鼠标键盘和动内存,应该没别的方法了...
看还有没有高手了~
2015-1-1 18:03
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
大漠有些是鼠标消息 有些是DX鼠标消息 有些是用驱动来模拟的
2015-1-1 21:34
0
雪    币: 157
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
dx鼠标消息很难吗?
2015-1-4 09:34
0
游客
登录 | 注册 方可回帖
返回
//