1943很经典的街机游戏

我突然想用鼠标来控制飞机可以吗?于是网上找了一下,没有找鼠标移动映射键盘的软件。

自己建了一个C#项目,加入别人写好的全局鼠标钩子。

很简单的代码,实现了获取全局鼠标坐标并做相应的操作:

using Gma.System.MouseKeyHook;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace GetMousePoint
{public partial class Form1 : Form{[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]public static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo);private IKeyboardMouseEvents m_GlobalHook;int x_tmp;int y_tmp;public Form1(){InitializeComponent();         Control.CheckForIllegalCrossThreadCalls = false;Subscribe();}public void Subscribe(){// Note: for the application hook, use the Hook.AppEvents() insteadm_GlobalHook = Hook.GlobalEvents(); m_GlobalHook.MouseMoveExt += M_GlobalHook_MouseMoveExt;}private void M_GlobalHook_MouseMoveExt(object sender, MouseEventExtArgs e){label1.Text = e.X.ToString() + "," + e.Y.ToString();if (e.X > x_tmp) {label2.Text = "→"; keybd_event(Keys.D, 0, 0, 0); }if (e.X < x_tmp) {label2.Text = "←"; ; keybd_event(Keys.A, 0, 0, 0);}if (e.Y < y_tmp) {label4.Text = "↑";; keybd_event(Keys.W, 0, 0, 0);}if (e.Y > y_tmp) {label4.Text = "↓";; keybd_event(Keys.S, 0, 0, 0);}x_tmp = e.X;y_tmp = e.Y;         } }}

但FBA V2.4.0 版本的游戏模拟器油盐不进,对它发消息,它没有反应,SPY++看不到它的任何消息。今天晚上时间不够了,就研究到这里。

------2022.2.20------

仔细看了一下,是SPY++64位32位的问题,确认可以收到消息后,模拟键盘按键给FBA发了键盘消息。又出现了新问题,SPY++可以看到程序发给FBA的消息和实际的消息完全一样,但是FBA不能识别。

可能是因为FBA使用了DIRECTX INPUT,一般的模拟键盘消息对它无效,程序也尝试了线程挂接,只是没再进一步使用HOOK注入。

找到一个WINIO方法,据说可以对付DIRECTX INPUT不识别消息的顽症。

C#的例子程序写的很完整,但是WINIO32.DLL居然网上下载不到,文章地址:

一个C#写的模拟键盘输入的例子_lucky811的专栏-CSDN博客

那么,后面还需要找一个WIN10,VS2019环境下可以使用WINIO32.DLL的DEMO。

-------2022.2.25-----------

WINIO32.DLL这条路不通,在百度搜索 directx input 模拟键盘,在知乎上有个回答,还有一个是WIN10场景最新的场景。看来可行。

-------2022.2.26-----------

今天终于成功了,用右手控制鼠标控制了一下飞机,但是要达到极致体验,程序还需要调试一下,让鼠标的移动跟上飞机。比如:一个方向一个线程,因为程序只会傻填键盘缓冲区,四个方向都是单独线程控制才比较合理。

全部的C# 代码如下(鼠标中键工作,右键停止):

using Gma.System.MouseKeyHook;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace GetMousePoint
{public partial class Form1 : Form{[DllImport("user32.dll")] static extern IntPtr GetForegroundWindow();[DllImport("user32.dll")] static extern bool SetForegroundWindow(IntPtr hWnd);//----------------------------------------------------------------------[DllImport("user32 ")]private static extern IntPtr EnumChildWindows(int hWndParent, EnumWindowsProc lpEnumFunc, int lParam);public delegate bool EnumWindowsProc(int hWnd, int lParam);[DllImport("user32.dll", EntryPoint = "GetClassName")]public static extern int GetClassName(int hWnd, StringBuilder lpString, int nMaxCont);[DllImport("User32.dll")]static extern int GetWindowText(IntPtr handle, StringBuilder text, int MaxLen);//------------------------------------------------------------------------[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]public static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo);[DllImport("user32.dll")] static extern byte MapVirtualKey(byte wCode, int wMap);public static List<WinObject> ListWin = new List<WinObject>();private IKeyboardMouseEvents m_GlobalHook;int x_tmp;int y_tmp;      int mouse_x = 0;int mouse_y = 0;bool IsOpen = false;MouseEventExtArgs gv_e;public Form1(){InitializeComponent();//加载全局钩子Subscribe();Control.CheckForIllegalCrossThreadCalls = false;Thread t11 = new Thread(new ThreadStart(Worker11));t11.Start();              Thread t12 = new Thread(new ThreadStart(Worker12));t12.Start();Thread t13 = new Thread(new ThreadStart(Worker13));t13.Start();Thread t14 = new Thread(new ThreadStart(Worker14));t14.Start();Thread t2 = new Thread(new ThreadStart(Worker2));t2.Start();                 Thread t3 = new Thread(new ThreadStart(Worker3));t3.Start();}public void Worker11(){while (true){Thread.Sleep(5);if (IsOpen){if (mouse_y == -1) { MyKey(Keys.S); }}}}public void Worker12(){while (true){Thread.Sleep(5);if (IsOpen){              if (mouse_y == 1) { MyKey(Keys.W); }}}}public void Worker13(){while (true){Thread.Sleep(5);if (IsOpen){if (mouse_x == 1) { MyKey(Keys.D); }                  }}}public void Worker14(){while (true){Thread.Sleep(5);if (IsOpen){                 if (mouse_x == -1) { MyKey(Keys.A); }}}}public void Worker2(){while (true){Thread.Sleep(100);if (gv_e != null){label1.Text = gv_e.X.ToString() + "," + gv_e.Y.ToString();if (gv_e.X > x_tmp) { label2.Text = "→"; mouse_x = 1; }if (gv_e.X == x_tmp) { label2.Text = "0"; mouse_x = 0; }if (gv_e.X < x_tmp) { label2.Text = "←"; mouse_x = -1; }         x_tmp = gv_e.X;}}}public void Worker3(){while (true){Thread.Sleep(100);if (gv_e != null){   if (gv_e.Y < y_tmp) { label4.Text = "↑"; mouse_y = 1; }if (gv_e.Y == y_tmp) { label4.Text = "0"; mouse_y = 0; }if (gv_e.Y > y_tmp) { label4.Text = "↓"; mouse_y = -1; }y_tmp = gv_e.Y;}}}public void Subscribe(){// Note: for the application hook, use the Hook.AppEvents() insteadm_GlobalHook = Hook.GlobalEvents(); m_GlobalHook.MouseMoveExt += M_GlobalHook_MouseMoveExt;       m_GlobalHook.MouseClick += M_GlobalHook_MouseClick;}       private void M_GlobalHook_MouseClick(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Middle){EnumChildWindows(0, new EnumWindowsProc(EnumWindowCallBack), 0);if (ListWin.Count > 0) { label6.Text = "locked windows"; }SetForegroundWindow(ListWin.FirstOrDefault().hand);IsOpen = true;label3.Text = "IsOpen: true";};if (e.Button == MouseButtons.Right){IsOpen = false; label3.Text = "IsOpen: false";label6.Text = "UnLocked windows";}}      private void M_GlobalHook_MouseMoveExt(object sender, MouseEventExtArgs e){gv_e = e;           }private void MyKey(System.Windows.Forms.Keys x){             keybd_event(x, (byte)MapVirtualKey(Convert.ToByte(x), 0), 0, 0);Thread.Sleep(5);keybd_event(x, (byte)MapVirtualKey(Convert.ToByte(x), 0), 0x0002, 0);       }public class WinObject{public bool isprocess { get; set; }public IntPtr hand { get; set; }public string ClassName { get; set; }public string text { get; set; }}public static bool EnumWindowCallBack(int hWnd, int lParam){try{WinObject one = new WinObject();one.isprocess = false;one.hand = (IntPtr)hWnd;StringBuilder name = new StringBuilder(256);GetClassName(hWnd, name, 256);one.ClassName = name.ToString();StringBuilder text = new StringBuilder(100);GetWindowText((IntPtr)hWnd, text, 100);one.text = text.ToString();if (one.ClassName.Equals("FBA shuffle")){ListWin.Add(one);}}catch { }return true;}}}

C# DIRECTX INPUT 模拟 (鼠标玩FBA街机)相关推荐

  1. atari游戏模型_在Atari.com免费玩经典街机游戏

    atari游戏模型 The late 70's and early 80's was a golden age for video games. Arcades were a thriving hot ...

  2. python玩转街机游戏,操作亲民!

    这是一个允许你在几乎任何街机游戏中训练你的强化学习算法的Python库,它目前在Linux系统上可用.通过这个工具包,你可以定制算法逐步完成游戏过程,同时接收每一帧的数据和内部存储器地址值以跟踪游戏状 ...

  3. FBA 街机游戏安卓盒子,游戏盒子实现双人对打,四人对打方案

    代码核心逻辑,修改配置的按键信息,配置play2,3,4 的按键返回值,然后上层传递下来,完成此游戏双人对打. 代码位置: // Get the state (pressed = 1, not pre ...

  4. linux用mame玩游戏,Ubuntu下用kxmame运行精彩的街机游戏

    闲得无聊,试试在Ubuntu玩一下那些经典的街机游戏,搜了下论坛,一般是用gxmame,先看看"添加/删除"里有没有,查找"gxmame",没有,倒是有个kxm ...

  5. C语言 在程序中打开网页,模拟鼠标点击、键盘输入

    C语言 在程序中打开网页,模拟鼠标点击.键盘输入 一.简述         记--使用C语言 打开指定网页,并模拟鼠标点击.键盘输入.实现半自动填写账号密码,并登录网站(当然现在的大部分网站都有验证码 ...

  6. ubuntu下面玩街机+北通野牛手柄

    记得小时候喜欢一元钱可以买4个游戏币      最喜欢玩的就是恐龙快打了. 在ubuntu下一直想重温下,今天就百度下玩的方法,下面我讲下是怎么做成的 : 我的ubuntu是用的gnome,所以开始我 ...

  7. C#模拟鼠标、键盘操作

    C语言 在程序中打开网页,模拟鼠标点击.键盘输入 一.简述         记--使用C语言 打开指定网页,并模拟鼠标点击.键盘输入.实现半自动填写账号密码,并登录网站(当然现在的大部分网站都有验证码 ...

  8. linux模拟器玩三国战记,三国战纪风云再起街机版

    三国战纪风云再起街机版带你回忆最初玩三国街机游戏的乐趣,多种对战玩法轻松上手,在三国战纪风云再起街机版手机游戏里面玩家可以随便选择一个角色进入战斗,强烈的打击感绝对让你爱不释手,在指尖畅享超酷的格斗盛 ...

  9. Atitit. 常用街机系统and 模拟器总结 snk neo geo cps mame sfc smc

    Atitit. 常用街机系统and 模拟器总结 snk neo geo cps mame sfc smc 1. #-------常用 游戏类型 1 2. 街机的历史 2 3. #=========== ...

  10. 安卓街机模拟器 MAME4droid 源码,只需要自己加入rom 可以发布到安卓市场了。

    安卓街机模拟器 MAME4droid 源码,只需要自己加入rom 可以发布到安卓市场了,可以开始自己的赚钱了.为了方便大家赚钱,apk展示的包含万普广告条,也就是只要自己去申请万普广告条,填一下app ...

最新文章

  1. PL/SQL -- INSTEAD OF 触发器
  2. 为什么下一个SaaS公司绝不会效仿Salesforce?
  3. node+express+MongoDB实现小商城服务端
  4. sizeof运算求结构体大小
  5. [转]使用target_system进行erlang应用的发行
  6. 与protected成员有关的单元测试方式
  7. 72 include动作和指令的区别
  8. Educational Codeforces Round 103 (Rated for Div. 2)A~E解题报告
  9. 4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(远程升级WIFI内部程序)
  10. PHP的 Warning: Cannot modify header information - headers already sent by警告
  11. Android Activity界面切换添加动画特效 (转载修改)
  12. matlab实现神经网络算法,matlab神经网络训练函数
  13. redis集群搭建管理入门
  14. nmos导通流向_MOS管知识详细说明!结构,原理,技术参数详解,一定要进来看下...
  15. 动物识别系统 python实现+UI
  16. redis --- List类型使用
  17. Camunda BPM 初步了解
  18. 广播级4K超高清非编系统
  19. 【博客181】查看一个端口是否被占用
  20. Proe(Creo)如何做剖面图

热门文章

  1. Linux环境安装ghostscript
  2. 计算机故障排除pdf,计算机常见故障排除方法【藏】.pdf
  3. 红帽子linux装mysql_红帽学习之Linux安装
  4. 小川opencv100例 之 准备食材 之 读取视频
  5. VHDL学习--分频器
  6. Eclipse 官方简体中文语言包下载地址及安装方法
  7. 永中云编辑(java版)
  8. unity物理引擎介绍
  9. 选课系统服务器,选课系统概要设计
  10. 维控触摸屏编程手册_维控触摸屏ab plc地址编程实例