C#模拟鼠标点击事件

「已注销」 2010-06-17 04:55:06
请问C#模拟鼠标点击事件去点击游戏进入游戏按钮,(人太多有时不会一下子能点进去)如点不进就一直点,并关闭弹出的提示框,若点进去了,就自动停止点击,请大家给个思路。
...全文
4502 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
aykldrxl 2011-02-28
  • 打赏
  • 举报
回复
hao de zhi chi
「已注销」 2010-06-21
  • 打赏
  • 举报
回复
难道叫网页游戏?
[Quote=引用 22 楼 enderboy520 的回复:]

顺便 你居然管梦幻叫桌面游戏
BS你


DND都没说什么
注意 此DND非那个横板PK的那个恶心的DND
[/Quote]
xk1126 2010-06-18
  • 打赏
  • 举报
回复
方法一:
调用api

Declare Sub mouse_event()Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Const MOUSEEVENTF_LEFTDOWN = &H2 '模拟鼠标左键按下
Public Const MOUSEEVENTF_LEFTUP = &H4 ’模拟鼠标左键释放
Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 '模拟鼠标中间键按下
Public Const MOUSEEVENTF_MIDDLEUP = &H40 '模拟鼠标中间键释放
Public Const MOUSEEVENTF_RIGHTDOWN = &H8 '模拟鼠标右键按下
Public Const MOUSEEVENTF_RIGHTUP = &H10 '模拟鼠标右键释放
Public Const MOUSEEVENTF_MOVE = &H1 '模拟鼠标指针移动 例: mouse_event MOUSEEVENTF_LEFTDOWN,10,10,0,0
'在(10,10)模拟鼠标左键按下

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yzh8734/archive/2007/04/28/1588387.aspx

方法二:

namespace ClassLibrary.Hardware
...{
public class Mouse
...{
internal const byte SM_MOUSEPRESENT = 19;
internal const byte SM_CMOUSEBUTTONS = 43;
internal const byte SM_MOUSEWHEELPRESENT = 75;
internal struct POINTAPI
...{
internal int x;
internal int y;
}
internal struct RECT
...{
internal int left ;
internal int top ;
internal int right ;
internal int bottom ;
}
[System.Runtime.InteropServices.DllImport("user32.dll" , EntryPoint="SwapMouseButton")]
internal extern static int SwapMouseButton ( int bSwap );
[System.Runtime.InteropServices.DllImport("user32" , EntryPoint="ClipCursor")]
internal extern static int ClipCursor(ref RECT lpRect);
[System.Runtime.InteropServices.DllImport( "user32.dll" , EntryPoint="GetCursorPos" )]
internal extern static int GetCursorPos( ref POINTAPI lpPoint );
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint="ShowCursor")]
internal extern static bool ShowCursor ( bool bShow ) ;
[System.Runtime.InteropServices.DllImport( "user32.dll" , EntryPoint = "EnableWindow" )]
internal extern static int EnableWindow( int hwnd , int fEnable );
[System.Runtime.InteropServices.DllImport("user32.dll" , EntryPoint="GetWindowRect")]
internal extern static int GetWindowRect( int hwnd , ref RECT lpRect ) ;
[System.Runtime.InteropServices.DllImport("user32.dll" , EntryPoint="SetCursorPos")]
internal extern static int SetCursorPos ( int x , int y ) ;
[System.Runtime.InteropServices.DllImport("user32.dll" , EntryPoint="GetSystemMetrics")]
internal extern static int GetSystemMetrics( int nIndex );
[System.Runtime.InteropServices.DllImport("user32.dll" , EntryPoint="SetDoubleClickTime")]
internal extern static int SetDoubleClickTime ( int wCount );
[System.Runtime.InteropServices.DllImport("user32.dll" , EntryPoint="GetDoubleClickTime")]
internal extern static int GetDoubleClickTime() ;
[System.Runtime.InteropServices.DllImport("kernel32.DLL", EntryPoint="Sleep")]
internal extern static void Sleep ( int dwMilliseconds ) ;
//得到鼠标相对与全屏的坐标,不是相对与你的Form的,且与你的分辨率有关系
public static int FullScreenPosition_X
...{
get
...{
POINTAPI _POINTAPI = new POINTAPI();
GetCursorPos ( ref _POINTAPI );

return _POINTAPI.x;
}
}

public static int FullScreenPosition_Y
...{
get
...{
POINTAPI _POINTAPI = new POINTAPI();
GetCursorPos ( ref _POINTAPI );

return _POINTAPI.y;
}
}
// 隐藏 显示 鼠标
public static void Hide()
...{
ShowCursor( false ) ;
}

public static void Show()
...{
ShowCursor( true ) ;
}
// 将鼠标锁定在你的Form里 不过你得将你的Form先锁了,Form Resize 就失效了
public static void Lock( System.Windows.Forms.Form ObjectForm )
...{
RECT _FormRect = new RECT ();

GetWindowRect( ObjectForm.Handle.ToInt32() , ref _FormRect );

ClipCursor( ref _FormRect );
}

public static void UnLock()
...{
RECT _ScreenRect = new RECT ();

_ScreenRect.top = 0;
_ScreenRect.left = 0;
_ScreenRect.bottom = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Bottom;
_ScreenRect.right = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Right;

ClipCursor( ref _ScreenRect );
}
// 鼠标失效,不过失效的好像不只是鼠标,小心哦
public static void Disable( System.Windows.Forms.Form ObjectForm )
...{
EnableWindow( ObjectForm.Handle.ToInt32() , 0 ) ;
}
public static void Enable( System.Windows.Forms.Form ObjectForm )
...{
EnableWindow( ObjectForm.Handle.ToInt32() , 1 ) ;
}
// 鼠标自己移动 很想动画哦 参数是2个控件的handle
// 看这个方法前,先用凉水擦把脸。。。 反正我写的时候 头晕
public static void Move ( int From_Handle_ToInt32 , int To_Handle_ToInt32 )
...{
RECT rectFrom = new RECT () ;
RECT rectTo = new RECT () ;

int i ;

GetWindowRect( From_Handle_ToInt32 , ref rectFrom ) ;
GetWindowRect( To_Handle_ToInt32 , ref rectTo ) ;
if ( ( rectFrom.left + rectFrom.right ) / 2 - ( rectTo.left + rectTo.right ) / 2 > 0 )
...{
for ( i = ( rectFrom.left + rectFrom.right ) / 2 ; i >= ( rectTo.left + rectTo.right ) / 2 ; i-- )
...{
SetCursorPos ( i , ( rectFrom.top + rectFrom.bottom ) / 2) ;
Sleep ( 1 ) ;
}
}
else
...{
for ( i = ( rectFrom.left + rectFrom.right ) / 2 ; i <= ( rectTo.left + rectTo.right ) / 2 ; i++ )
...{
SetCursorPos ( i , ( rectFrom.top + rectFrom.bottom ) / 2) ;
Sleep ( 1 ) ;
}
}
if ( ( rectFrom.top + rectFrom.bottom ) / 2 - ( rectTo.top + rectTo.bottom ) / 2 > 0 )
...{
for ( i = ( rectFrom.top + rectFrom.bottom ) / 2 ; i >= ( rectTo.top + rectTo.bottom ) / 2 ; i-- )
...{
SetCursorPos ( ( rectTo.left + rectTo.right ) / 2 , i ) ;
Sleep ( 1 ) ;
}
}
else
...{
for ( i = ( rectFrom.top + rectFrom.bottom ) / 2 ; i <= ( rectTo.top + rectTo.bottom ) / 2 ; i++ )
...{
SetCursorPos ( ( rectTo.left + rectTo.right ) / 2 , i ) ;
Sleep ( 1 ) ;
}
}
}

// 得到你的鼠标类型
public static string Type
...{
get
...{
if ( GetSystemMetrics( SM_MOUSEPRESENT ) == 0 )
...{
return "本计算机尚未安装鼠标" ;
}
else
...{
if ( GetSystemMetrics( SM_MOUSEWHEELPRESENT ) != 0 )
...{
return GetSystemMetrics( SM_CMOUSEBUTTONS ) + "键滚轮鼠标" ;
}
else
...{
return GetSystemMetrics( SM_CMOUSEBUTTONS ) + "键鼠标" ;
}
}
}
}
// 设置鼠标双击时间

public static void DoubleClickTime_Set( int MouseDoubleClickTime )
...{
SetDoubleClickTime( MouseDoubleClickTime );
}

public static string DoubleClickTime_Get()
...{
return GetDoubleClickTime().ToString() ;
}
// 设置鼠标默认主键 我是没有见过谁左手用鼠标
public static void DefaultRightButton()
...{
SwapMouseButton ( 1 ) ;
}

public static void DefaultLeftButton()
...{
SwapMouseButton ( 0 ) ;
}
}
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yzh8734/archive/2007/04/28/1588387.aspx
enderboy520 2010-06-18
  • 打赏
  • 举报
回复
顺便 你居然管梦幻叫桌面游戏
BS你


DND都没说什么
注意 此DND非那个横板PK的那个恶心的DND
enderboy520 2010-06-18
  • 打赏
  • 举报
回复
狠悲惨的告诉你 梦幻封了低层的一些应用
我曾经想干坏事
可惜没用

别用高级语言把

C#绝对没戏

C++还有点用
顺便 梦幻真WINIO那个都封了
捷哥1999 2010-06-18
  • 打赏
  • 举报
回复
请问C#模拟鼠标点击事件去点击游戏进入游戏按钮,(人太多有时不会一下子能点进去)如点不进就一直点,并关闭弹出的提示框,若点进去了,就自动停止点击,请大家给个思路。

思路如下:
1、通过API函数,找到窗口的句柄
        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);


2、找到按钮的句柄

3、通过下面的API发送消息
        [DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
sardineany 2010-06-18
  • 打赏
  • 举报
回复
VS挤房器。。。。
mingcsharp 2010-06-18
  • 打赏
  • 举报
回复
C#模拟鼠标点击事件去
Mouse_event api
xrongzhen 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xrongzhen 的回复:]
C# code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms……
[/Quote]

只有登录按钮所在的窗体在激活时才能点中。 可以用ShowWindow()先激活窗体,然后再点击操作
xrongzhen 2010-06-18
  • 打赏
  • 举报
回复

//如果想不停的点击 加个Timer不停点击。 或者加个变量IsLogin = FindWindow(null,"登陆成功后的标题 或 登录失败提示标题")
xrongzhen 2010-06-18
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace ClickButton_SendMessage
{
public delegate bool CallBack(IntPtr hwnd, int lParam);


public partial class frmMain : Form
{

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr FindWindow(string strClass, string strWindow);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr EnumChildWindows(IntPtr hWndParent, CallBack lpEnumFunc, int lParam);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowRect(IntPtr hwnd,RECT lpRect);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int SetCursorPos(int x,int y);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int SetForegroundWindow(IntPtr hwnd);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern void mouse_event(int dwFlags,int dx,int dy,int cButtons, int dwExtraInfo);
public const int MOUSEEVENTF_LEFTDOWN = 0x2;
public const int MOUSEEVENTF_LEFTUP = 0x4;

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr hwnd, string lpString, int cch);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowTextLength(IntPtr hwnd);




public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}

public struct POINT
{
public int x;
public int y;
}

public static int nCount;

public frmMain()
{
InitializeComponent();

}




public static bool EnumWindowsProc(IntPtr h, int lParam)
{

string strText=new string((char)0,255);
RECT hRect=new RECT();

nCount = nCount + 1;

int Ret=0;

Ret = GetWindowTextLength(h);
string sSave = new string((char)9, Ret);
GetWindowText(h, sSave, Ret + 1);
if(sSave.IndexOf("Click Me",0) > -1)//"Click Me"是按钮的名称 按你的就是“登录”
{
//GetWindowRect(h, hRect);
//SetCursorPos((hRect.Left + hRect.Right) / 2, (hRect.Top + hRect.Bottom) / 2);
SetCursorPos(200, 160); //这里是直接通过Spy++获取的按钮“Click Me”的位置
SetForegroundWindow(h);
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
return false;
}
return true;
}

private void button1_Click(object sender, EventArgs e)
{
IntPtr h;
string strName = "Demo"; //新建一个项目 主窗体标题是"Demo"。这里可直接换成你的登录框的标题
h = FindWindow(null, strName);
Debug.Print(h.ToString());
if (h.ToInt32() != 0)
{
CallBack myCallBack = new CallBack(frmMain.EnumWindowsProc);
EnumChildWindows(h, myCallBack, 0);
}
}
}
}


jianuMan 2010-06-17
  • 打赏
  • 举报
回复
web的没弄过

如果是form的话
使用Windows函数
::PostMessage(m_hTarget, WM_MOUSEMOVE, MK_LBUTTON, MAKELPARAM(pt2.x, pt2.y));
来发送鼠标点击, 点击之后,Sleep(500),然后取按钮的颜色,判断是不是和已经按下的颜色相同。
如果不是,则按钮没有按下,继续点击,再取颜色,反之,则不再点击。

看看这篇blog 里面有鼠标模拟操作游戏的 原理和代码
http://blog.csdn.net/jianuMan/archive/2010/06/17/5676194.aspx
wxm3630478 2010-06-17
  • 打赏
  • 举报
回复
mark......
INGDI 2010-06-17
  • 打赏
  • 举报
回复
取得对象,调用点击函数
xrongzhen 2010-06-17
  • 打赏
  • 举报
回复
获取按钮句柄,然后SendMessage
SendMessage(Button1.Handle, WM_LBUTTONDOWN,0,0);



如果不知道按钮句柄
则FindWindow()获取窗体句柄
SetCursorPos 设置鼠标位置
mouse_event(MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
cecilia2006 2010-06-17
  • 打赏
  • 举报
回复
这个我做过 给个思路吧 
1首先要获得这个button所在窗体的句柄(API 函数获得) 然后API SendMessage 函数去执行点击这个操作(其中的点击参数 楼主查查) 
2 点击后 停顿sleep 几秒  为了弹出这个是否登录成功的验证框 

3然后根据提示框的title去找是否存在这个窗体的句柄(API findwindown 这个函数 具体的楼主去查查) 如果单位时间内没出现 则判读成功
(合适的方法是检验是否出现了登录成功后出现的窗体句柄)  否则则过个几秒 继续点击执行先前的操作
「已注销」 2010-06-17
  • 打赏
  • 举报
回复
想自己试试……
[Quote=引用 7 楼 ajq1989 的回复:]

直接下个按键精灵。。。 百度就有了。
[/Quote]
ajq1989 2010-06-17
  • 打赏
  • 举报
回复
直接下个按键精灵。。。 百度就有了。
「已注销」 2010-06-17
  • 打赏
  • 举报
回复
这个算不上外挂吧,只是挤号用的,省的手点累,不是WEB游戏,是桌面游戏(梦幻西游)
加载更多回复(5)

110,578

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧