怎么用SendMessage向其他窗口发送按键

ly19940807 2011-09-09 11:44:06
怎么用SendMessage向其他窗口发送按键?????
小弟想做一个DNF的连发程序,不想下载人家的,想自己写一个
比如向窗口发送 K 这个键,下面是我的代码

//发送按键
[DllImport("user32.dll", EntryPoint = "SendMessage")]
static extern bool SendMessage(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam);
//查找窗口句柄
[DllImport("USER32.DLL")]
public static extern IntPtr FindWindow(string lpClassName,
string lpWindowName);
//设置进程窗口到最前
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
//WM_KEYDOWN 按下一个键
public static int WM_KEYDOWN = 0x0100;
//释放一个键
public static int WM_KEYUP = 0x0101;
//K键的键盘值
public const int VK_SPACE = 75;
private void button1_Click(object sender, EventArgs e)
{
IntPtr dnf = FindWindow(null, "地下城与勇士");
//如果找到窗口句柄
if (dnf != IntPtr.Zero)
{
//设置游戏窗口到最前
SetForegroundWindow(dnf);
SendMessage(dnf, WM_KEYDOWN, VK_SPACE, 0);
SendMessage(dnf, WM_KEYUP, VK_SPACE, 0);
}

}

代码哪里错了?我只知道第一个参数是发送目标窗口的句柄,那第二个,第三个,第四个参数都是怎么写的?
麻烦大家指导一下
...全文
1050 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly19940807 2011-09-11
  • 打赏
  • 举报
回复
嗯,keybd_event这个函数我试了不行,想试试SENDMESSAGE但是不知道后3个参数怎么写
sdl2005lyx 2011-09-11
  • 打赏
  • 举报
回复
你在VC里面怎样使用SendMessage的,既然你采取平台调用,在C#做了对应的声明,那在C#的使用方:那第二个,第三个,第四个参数,跟VC使用一样!

只是在接收处理一方有区别:

protected override void DefWndProc(ref Message m)
{
try
{
switch (m.Msg)
{
case 0x0100: //处理消息WM_KEYDOWN,wParam,lParam在Message类对应成员里
//加上你处理的代码
break;
default:
base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
break;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message + "DefWndProc");
}

}
  • 打赏
  • 举报
回复
获取句柄发就是了。但是很多时候哈,默认是窗体标题收。所以你要获取控件句柄。
还有就是,QQ等一些有安全措施的,获取密码呀,发送按键都是不可行的,这也让我万分郁闷。但是可定有办法解决的,只是很难。我以前用鼠标点击和发送按键写梦幻西游外挂,最后sendmessage是不行的,只有sendkeys行(貌似是这个,我也快忘了,呵呵)这个不是win32Api的,就是一个方法而已。很简单~~~但是网上又有这些外挂和盗号的,证明是可以破解的。关键是技术,瞎扯了一通。
萧炎 2011-09-10
  • 打赏
  • 举报
回复
DNF?
地下城与勇士?
pupo 2011-09-10
  • 打赏
  • 举报
回复
很多游戏都是屏蔽了sendmessage的
Herbert 2011-09-10
  • 打赏
  • 举报
回复
游戏窗口和普通窗口不一样吧 你拿普通程序试下
Icedmilk 2011-09-09
  • 打赏
  • 举报
回复
如果你已经让接受消息的窗口在最前就可以直接调用keybd_event这个函数来产生消息

另外WinForm有个SendKeys类是干这个的
作为Microsoft 32位平台的应用程序编程接口,Win32 API是从事Windows应用程序开发所必备的。本书首先对Win32 API函数做完整的概述;然后收录五大类函数:窗口管理、图形设备接口、系统服务、国际特性以及网络服务;在附录部分,讲解如何在Visual Basic和Delphi中对其调用。 本书是从事Windows应用程序开发的软件工程师的必备参考手册。 Win32 API作为 Microsoft 32位平台(包括:Windows 9x,Windows NT3.1/4.0/5.0,WindowsCE)的应用程序编程接口,它是构筑所有32位Windows平台的基石,所有在Windows平台上运行的应用程序都可以调用这些函数。 从事Windows应用程序开发,离不开对Win32 API函数的调用。只有充分理解和利用API函数,才能深入到Windows的内部,充分挖掘系统提供的强大功能和灵活性。 近年来,随着Microsoft 32位平台的版本升级, Win32 API函数的构成、功能与调用方式都有很大的发展变化,然而,国内很少有相关的新版资料出版。为了满足广大开发人员的迫切需求,我们经过认真收集、整理素材,组织编写了这本与各种Microsoft 32位平台最新版本同步的Win32 API参考手册。 全书收录了五大类函数:窗口管理、图形设备接口、系统服务、国际特性以及网络服务。所有函数均附有功能说明、参数说明、返回值说明、备注以及引用说明。另外,在本书的第一章,我们对WiN32 API函数作了完整的概述;在附录部分,讲解了如何在Visual Basic和Delphi中对其调用。 由于篇幅较大,涉及技术内容广泛,加之时间仓促,书中难免存在不少错误或疏漏,希望广大读者给与批评指正。 在Windows程序设计领域处于发展初期时,Windows程序员可使用的编程工具唯有API函数。这些函数在程序员手中犹如"积木块"一样,可搭建出各种界面丰富、功能灵活的应用程序。不过,由于这些函数结构复杂,所以往往难以理解,而且容易误用。 随着软件技术的不断发展,在Windows平台上出现了很多优秀的可视化编程环境,程序员可以采用"所见即所得"的编程方式来开发具有精美用户界面和功能的应用程序。这些可视化编程环境操作简便、界面友好,比如:Visual C++,Delphi,Visual Basic等等。在这些工具中提供了大量的类库和各种控件,它们替代了API的神秘功能。事实上,这些类库和控件都是构筑在Windows API的基础上的,但它们使用方便,加速了Windows应用程序的开发,所以受到程序员的普遍采用。有了这些类库和控件,程序员们便可以把主要精力放在整体功能的设计上,而不必过于关注具体细节。不过,这也导致了非常多的程序员在类库面前"固步自封",对下层API函数的强大功能一无所知。 实际上。程序员要想开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用API函数。虽然类库和控件使应用程序的开发容易得多,但它们只提供Microsoft Windows的一般功能,对于一些比较复杂和特殊的功能来说,单使用类库和控件是难以实现的,必须直接使用API函数来编写。API函数是构筑整个Windows框架的基石,只有充分理解和利用API函数,才能深入到Windows的内部,充分发挥各种32位平台的强大功能和灵活性,才能成功地扩展和突破类库、控件和可视开发环境的限制。 Win32 API即为Microsoft 32位平台的应用程序编程接口(Application Programming Interface)。所有在Win32平台上运行的应用程序都可以调用这些函数。 使用Win32 API,应用程序可以充分挖掘Windows的32位操作系统的潜力。 Mircrosoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用 Win32 API不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。 在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些函数只能在更强大的平台上实现其功能。例如,安全函数只能在Windows NT操作系统下使用。另外一些主要差别就是系统限制,比如值的范围约束,或函数可管理的项目个数等等。 标准Win32 API函数可以分为以下几类: 窗口管理 窗口通用控制 Shell特性 图形设备接口 系统服务 国际特性 网络服务 在下面各节中,我们分别介绍这7种类型的API函数。 窗口管理函数向应用程序提供了一些创建和管理用户界面的方法。你可以使用窗口管理函数创建和使用窗口来显示输出、提示用户进行输入以及
.版本 2 .程序集 Flash播放类, , 公开 .子程序 窗口_菜单, 逻辑型, 公开 .参数 操作, 整数型, , 1.使菜单正常显示;2.只显示“关于”菜单;3.屏蔽菜单 .子程序 窗口_创建, 整数型, 公开, 创建一个Flash播放窗口,成功返回窗口句柄,失败返回0。 .参数 父窗口句柄, 整数型 .参数 左边, 整数型 .参数 顶边, 整数型 .参数 宽度, 整数型 .参数 高度, 整数型 .参数 右键菜单, 整数型, 可空, 1.正常显示;2.只显示“关于”菜单;3.屏蔽菜单,留空默认为1。 .参数 窗口风格, 整数型, 可空, 数值自己查,留空默认为无边框 .参数 扩展风格, 整数型, 可空, 数值自己查,留空为默认 .子程序 窗口_顶边, 整数型, 公开, 设定或取得Flash窗口相对于父窗口的顶边。 .参数 新顶边, 整数型, 可空, 不留空为设定,留空为取。 .子程序 窗口_高度, 整数型, 公开, 设定或取得Flash窗口相对于父窗口的高度。 .参数 新高度, 整数型, 可空, 不留空为设定,留空为取。 .子程序 窗口_挂接事件, 逻辑型, 公开, 挂接事件,不想设置的参数就留空,成功返回真,失败返回假。 .参数 鼠标位置被移动, 子程序指针, 可空, 必须有三个参数,分别为:横向位置、纵向位置、按键信息(即wParam的值,含义上网查);●注意:应该返回一个逻辑值,如果返回真,则将此事件继续传递到窗口上去,如果返回假或无返回值,则取消本事件,不再将此事件传递到窗口上去。 .参数 鼠标左键被按下, 子程序指针, 可空, 说明同上 .参数 鼠标左键被放开, 子程序指针, 可空, 说明同上 .参数 鼠标左键被双击, 子程序指针, 可空, 说明同上 .参数 鼠标右键被按下, 子程序指针, 可空, 说明同上 .参数 鼠标右键被放开, 子程序指针, 可空, 说明同上 .参数 按下某键, 子程序指针, 可空, 必须有两个参数,分别为:键代码、按键信息(即lParam的值,含义上网查);●注意:应该返回一个逻辑值,如果返回真,则将此事件继续传递到窗口上去,如果返回假或无返回值,则取消本事件,不再将此事件传递到窗口上去。 .参数 放开某键, 子程序指针, 可空, 说明同上 .子程序 窗口_禁止, 逻辑型, 公开, 设定或判断Flash窗口是否被禁止,真被禁止,假为未被禁止。 .参数 是否禁止, 逻辑型, 可空, 不留空为设定,留空为取。 .子程序 窗口_可视, 逻辑型, 公开, 设定或判断Flash窗口是否可视。真为可视,假为不可视。 .参数 是否可视, 逻辑型, 可空, 不留空为设定,留空为取。 .子程序 窗口_宽度, 整数型, 公开, 设定或取得Flash窗口相对于父窗口的宽度。 .参数 新宽度, 整数型, 可空, 不留空为设定,留空为取。 .子程序 窗口_取句柄, 整数型, 公开, 取得Flash窗口的句柄。 .子程序 窗口_是否已创建, 逻辑型, 公开, 已创建返回真,反之假。 .子程序 窗口_销毁, , 公开, 销毁已经创建的Flash窗口。 .子程序 窗口_左边, 整数型, 公开, 设定或取得Flash窗口相对于父窗口的左边。 .参数 新左边, 整数型, 可空, 不留空为设定,留空为取。 .子程序 动画框_顶边, 整数型, 公开, 设定或取得动画图像相对于Flash窗口的顶边。 .参数 新顶边, 整数型, 可空, 不留空为设定,留空为取。 .子程序 动画框_高度, 整数型, 公开, 设定或取得动画图像的高度。 .参数 新高度, 整数型, 可空, 不留空为设定,留空为取。 .子程序 动画框_禁止, 逻辑型, 公开, 设定或判断动画图像所在窗口是否被禁止,真被禁止,假为未被禁止。 .参数 是否禁止, 逻辑型, 可空, 不留空为设定,留空为取。 .子程序 动画框_可视, 逻辑型, 公开, 设定或判断动画图像所在窗口是否可视。真为可视,假为不可视。 .参数 是否可视, 逻辑型, 可空, 不留空为设定,留空为取。 .子程序 动画框_宽度, 整数型, 公开, 设定或取得动画图像的宽度。 .参数 新宽度, 整数型, 可空, 不留空为设定,留空为取。 .子程序 动画框_取句柄, 整数型, 公开, 取得动画所在窗口的句柄。 .子程序 动画框_左边, 整数型, 公开, 设定或取得动画图像相对于Flash窗口的的左边。 .参数 新左边, 整数型, 可空, 不留空为设定,留空为取。 .子程序 控制_播放, , 公开 .子程序 控制_返回, , 公开, 返回到开头处 .子程序 控制_放大, , 公开, 放大图像 .参数 倍数, 双精度小数型, , 指定相对于当前图像尺寸的放大倍数,大于1为放大,等于1为不改变当前尺寸,小于1为缩小(若此时为原尺寸则无效),等于0为原尺寸。 .子程序 控制_后退, , 公开, 后退一帧并停止播放 .子程序 控制_挪动图像, 逻辑型, 公开, 将一个放大过的动画平移到指定的位置。 .参数 x, 整数型, , 单位为像素 .参数 y, 整数型 .子程序 控制_前进, , 公开 .子程序 控制_清除已载入文件, , 公开, 清除已载入的Flash文件。 .子程序 控制_取当前播放帧数, 整数型, 公开, 帧数从0算起,0表示动画的第一帧 .子程序 控制_取当前状态, 整数型, 公开, 0.正在载入;1.未初始化;2.已载入;3.正在交互;4.完成 .子程序 控制_取控制对象, 对象, 公开, Flash对象里面还有许多功能,我只封装了最常用的,得到对象后用 对象.查看() 自己研究其他功能如何使用。对象的属性、方法说明见:http://s8.hk/3tyq .子程序 控制_取已载入百分比, 整数型, 公开, 返回Flash播放器已经装载动画的百分比,0-100。 .子程序 控制_是否可跳转, 逻辑型, 公开, 检测可否跳转到某帧。 .参数 要跳到的帧, 整数型, , 帧数从0算起,0表示动画的第一帧 .子程序 控制_是否正在播放, 逻辑型, 公开 .子程序 控制_跳到某帧, , 公开 .参数 要跳到的帧, 整数型, , 帧数从0算起,0表示动画的第一帧 .子程序 控制_暂停, , 公开 .子程序 消息_发送, 整数型, 公开, 用SendMessage给Flash窗口发送消息 .参数 消息号, 整数型 .参数 参数1, 整数型 .参数 参数2, 整数型 .子程序 消息_投递, 逻辑型, 公开, 用PostMessage给Flash窗口投递消息 .参数 消息号, 整数型 .参数 参数1, 整数型 .参数 参数2, 整数型 .子程序 载入_Flash文件, 逻辑型, 公开 .参数 文件路径或URL, 文本型, , 可播放磁盘文件或网络上的文件 .参数 不循环播放, 逻辑型, 可空, 默认为假,即不断循环播放,为真则只播放一次 .参数 不立即播放, 逻辑型, 可空, 默认为假,即一载入就开始播放 .子程序 载入_内存中的Flash, 逻辑型, 公开, 载入内存或资源里的swf文件直接播放 .参数 Flash文件, 字节集, , Flash文件数据 .参数 不循环播放, 逻辑型, 可空, 默认为假,即不断循环播放,为真则只播放一次 .参数 不立即播放, 逻辑型, 可空, 默认为假,即一载入就开始播放 .子程序 属性_背景颜色, 整数型, 公开, 取得或设定Flash窗口的背景颜色,失败返回-1。 .参数 新RGB颜色值, 整数型, 可空, 不留空为设定,留空为取。 .子程序 属性_窗口模式, 整数型, 公开, 取得或设定Flash窗口窗口模式,失败返回-1。 .参数 新窗口模式, 整数型, 可空, 不留空为设定,留空为取。1.默认模式;2.窗口不可透明;3.窗口可透明(如果动画中有透明的片段,放到这里时,就可以看到控件下面的背景)。 .子程序 属性_对齐方式, 整数型, 公开, 取得或设定动画图像的对齐模式,失败返回-1,已载入Flash后本属性才有效。 .参数 新对齐方式, 整数型, 可空, 不留空为设定,留空为取。1.左对齐;2.右对齐;4.顶对齐;8.底对齐,可以各项相加进行组合,比如同时左对齐和顶对齐为5。 .子程序 属性_可否全屏, 逻辑型, 公开, 取得或设定Flash是否允许全屏播放(只有Flash内部也设置有这个选项时本属性才有效)。 .参数 新值, 逻辑型, 可空, 不留空为设定,留空为取。真表示允许全屏,假表示不允许。 .子程序 属性_品质, 整数型, 公开, 设定或取得Flash的播放品质,1.高;2.中等;3.低,失败返回-1。 .参数 新品质, 整数型, 可空, 不留空为设定,留空为取。 .子程序 属性_取当前文件, 文本型, 公开, 取当前已载入的文件路径。 .子程序 属性_取总帧数, 整数型, 公开, 取已载入Flash的总帧数。 .子程序 属性_缩放模式, 整数型, 公开, 取得或设定Flash动画的缩放模式,失败返回-1。0.显示全部;1.沿长边拉伸;2.拉伸。 .参数 新缩放模式, 整数型, 可空, 不留空为设定,留空为取。 .子程序 属性_循环, 逻辑型, 公开, 取得或设定Flash是否循环播放。 .参数 是否循环, 逻辑型, 可空, 留空则为取,真为循环,假为不循环。
自定义窗体的最大化、最小化和关闭按钮, C#移动无标题栏窗体的三种代码: C#移动无标题栏窗体的三种代码:第一种采用,需注意窗体上的控件是否把窗体覆盖了。。。MouseDown、MouseMove、MouseUp事件应该是鼠标所处位置最顶层的控件的事件 在窗体的类中声明两个变量 private Point mouseOffset; //记录鼠标指针的坐标 private bool isMouseDown = false; //记录鼠标按键是否按下 创建该窗体 MouseDown、MouseMove、MouseUp事件的相应处理程序 private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { int xOffset; int yOffset; if (e.Button == MouseButtons.Left) { xOffset = -e.X ; yOffset = -e.Y ; mouseOffset = new Point(xOffset, yOffset); isMouseDown = true; } } private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { if (isMouseDown) { Point mousePos = Control.MousePosition; mousePos.Offset(mouseOffset.X, mouseOffset.Y); Location = mousePos; } } private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { // 修改鼠标状态isMouseDown的值 // 确保只有鼠标左键按下并移动时,才移动窗体 if (e.Button == MouseButtons.Left) { isMouseDown = false; } } 第二种调用API 未验证 using System.Runtime.InteropServices; [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); public const int WM_SYSCOMMAND = 0x0112; public const int SC_MOVE = 0xF010; public const int HTCAPTION = 0x0002; private void Form1_MouseDown(object sender, MouseEventArgs e) { ReleaseCapture(); SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); } 第三种未验证 private bool isMouseDown = false; private Point FormLocation; //form的location private Point mouseOffset; //鼠标的按下位置 [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); private const int WM_SYSCOMMAND = 0x0112;//点击窗口左上角那个图标时的系统信息 private const int SC_MOVE = 0xF010;//移动信息 private const int HTCAPTION = 0x0002;//表示鼠标在窗口标题栏时的系统信息 private const int WM_NCHITTEST = 0x84;//鼠标在窗体客户区(除了标题栏和边框以外的部分)时发送的消息 private const int HTCLIENT = 0x1;//表示鼠标在窗口客户区的系统消息 private const int SC_MAXIMIZE = 0xF030;//最大化信息 private const int SC_MINIMIZE = 0xF020;//最小化信息 protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_SYSCOMMAND: if (m.WParam == (IntPtr)SC_MAXIMIZE) { m.WParam = (IntPtr)SC_MINIMIZE; } break; case WM_NCHITTEST: //如果鼠标移动或单击 base.WndProc(ref m);//调用基类的窗口过程——WndProc方法处理这个消息 if (m.Result == (IntPtr)HTCLIENT)//如果返回的是HTCLIENT { m.Result = (IntPtr)HTCAPTION;//把它改为HTCAPTION return;//直接返回退出方法 } break; } base.WndProc(ref m);//如果不是鼠标移动或单击消息就调用基类的窗口过程进行处理 } private void Form1_Load(object sender, EventArgs e) { } ------------------------------- 如何在窗体标题栏左边的控制菜单加入自己的菜单啊? 我们一般在窗口标题栏点右键 或 按Alt+空格 可以弹出那个菜单。 ------解决方案-------------------- using System.Runtime.InteropServices; [DllImport( "user32.dll ")] public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); [DllImport( "user32.dll ")] public static extern bool InsertMenu(IntPtr hMenu, uint uPosition, uint uFlags, uint uIDNewItem, string lpNewItem); public const int MF_BYCOMMAND = 0; public const int MF_STRING = 0; public const int MF_BYPOSITION = 0x400; public const int MF_SEPARATOR = 0x800; private const uint SC_ABOUT = 0x0001; public const int WM_SYSCOMMAND = 0x0112; private void Form1_Load(object sender, EventArgs e) { IntPtr vMenuHandle = GetSystemMenu(Handle, false); InsertMenu(vMenuHandle, 255, MF_STRING, SC_ABOUT, "About... "); } protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_SYSCOMMAND: if ((uint)m.WParam == SC_ABOUT) { MessageBox.Show( "Zswang 路过! "); } break; } base.WndProc(ref m); }
ucGUI与emWin是众多嵌入式工程师编写显示界面的首选,但是随着版本的升级,对于商用GUI提出了专利费的要求,这也是国内小型企业所不愿意接受的。于是,编写了一份属于自己的独特GUI界面代码。作品采用stm32作为主MCU,驱动LCM12864进行显示。我们的任务是写自己的GUI,因此对其他外设资源要求不高。另能力仅属于中神级别,尚未炉炼至大神级别,因此我们先用单色LCM12864练手,此贴至此始终开源,供大家一起学习交流,把xlGUI丰富起来。 系统设计框图: 讲解: 1.xlGUI采用WM_Manage窗口管理器统一管理UI消息事件,用户交互消息(数据信息、按键事件等等)均通过WM_SendMessage发送至控件,由控件自行解析事件类型并响应消息; 2.整个工程中GUI_GDI是公共绘图接口,其作用是方便控件或者用户对显示屏进行绘制显示; 3.GUI_GDI统一调用GUI_Drive函数接口进行操作显存,本例程中,我们在GUI_GDI里面开辟了m_MemDev显示内存池,该内存池与显示屏显示像素一一对应,GUI_GDI所有函数默认直接操作显存池像素点。 显存刷新操作则统一由GUIDRV_DEVICE_API函数完成,用户不同类型的显示屏均可以通过编写GUI_Driver函数达到驱动显示目的。 制作成功实物图片: 说明: 作品全部使用C语言进行编写,通俗易懂,熟悉GDI界面编程的更加不会陌生。作品旨在提供小型GUI界面编程入门,并尽可能提供扩展接口,备注详细,方便各路嵌入式大神进行移植扩展维护,希望这版本GUI最终演化成能够替代ucGUI/emWin。 该项目设计来源于立创社区,设计资料仅供学习参考。

110,539

社区成员

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

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

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