本人想做一个游戏的辅助程序,现在需要模拟鼠标点击消息,已知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直播授课