设置首页收藏本站
开启左侧

send_mouse_down_event,send_mouse_up_event等如何使用?

[复制链接]
tystq 发表于 2019-6-12 11:31:02 | 显示全部楼层 |阅读模式
本帖最后由 tystq 于 2019-6-12 15:46 编辑

如题,没有搞明白send_mouse_down_event,send_mouse_up_event等如何使用,猜测是向指定窗口发送鼠标信号事件,但是执行的时候始终报错5123,希望实现的功能是draw_circle等阻塞算子不手动点击右键就能退出
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
绝地武士 发表于 2019-6-12 14:24:19 | 显示全部楼层
1.引用命名空间
  1. using System.Runtime.InteropServices;
复制代码

2.声明函数
  1. [DllImport("user32.dll")]
  2. public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

  3. [DllImport("user32.dll")]
  4. public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
复制代码

3.实现代码(窗口名称和Class名称用spy++去找就可以了):
  1. IntPtr myIntPtr = FindWindow(null, "HALCON/WIN32-3600");
  2. mouse_event(CWindowsApi.MOUSEEVENTF_RIGHTDOWN | CWindowsApi.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
复制代码

然后在绘制的时候可以发给Halcon的窗口也可以自己定义自己的窗口句柄去模拟鼠标右键!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| tystq 发表于 2019-6-12 15:02:40 | 显示全部楼层
绝地武士 发表于 2019-6-12 14:24
1.引用命名空间

2.声明函数

感谢你的回到,但是mouse_event模拟鼠标右键对halcon绘图完全无效,不信你自己去验证
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| tystq 发表于 2019-6-12 15:20:08 | 显示全部楼层
绝地武士 发表于 2019-6-12 14:24
1.引用命名空间

2.声明函数

根据你的思路,修改成下面的代码可以了
IntPtr myIntPtr = FindWindow(null, "HALCON/WIN32-200000");
            SetForegroundWindow(myIntPtr);//前置
            // mouse_event(0x8 | 0x10, 0, 0, 0, 0);
            mouse_event(0x8 , 0, 0, 0, 0);//鼠标右键按下
            System.Threading.Thread.Sleep(100);
            mouse_event( 0x10, 0, 0, 0, 0);//鼠标右键弹起
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
绝地武士 发表于 2019-6-12 15:20:46 | 显示全部楼层
tystq 发表于 2019-6-12 15:02
感谢你的回到,但是mouse_event模拟鼠标右键对halcon绘图完全无效,不信你自己去验证 ...

HDevelop中我已经验证了,draw_*算子执行后你需要绘制任意图形(否则直接右键也不行),然后就可以发送消息模拟右键就可以结束绘制!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| tystq 发表于 2019-6-12 15:24:00 | 显示全部楼层
绝地武士 发表于 2019-6-12 15:20
HDevelop中我已经验证了,draw_*算子执行后你需要绘制任意图形(否则直接右键也不行),然后就可以发送消 ...

感谢你的思路,已经OK,追加了前置和鼠标右键按下和弹起中间延时操作就OK啦
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| tystq 发表于 2019-6-12 15:47:44 | 显示全部楼层
绝地武士 发表于 2019-6-12 15:20
HDevelop中我已经验证了,draw_*算子执行后你需要绘制任意图形(否则直接右键也不行),然后就可以发送消 ...

刚才去C#中验证了,在窗体hWindowControl中绘图时无效{:1_306:}
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| tystq 发表于 2019-6-12 16:26:52 | 显示全部楼层
绝地武士 发表于 2019-6-12 15:20
HDevelop中我已经验证了,draw_*算子执行后你需要绘制任意图形(否则直接右键也不行),然后就可以发送消 ...

更奇怪的是把  mouse_event(0x8 | 0x10, 0, 0, 0, 0);写在button的MouseDown事件中点击按钮是可以的,但是写在Click事件中点击按钮就不行
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
绝地武士 发表于 2019-6-12 16:36:32 | 显示全部楼层
tystq 发表于 2019-6-12 15:47
刚才去C#中验证了,在窗体hWindowControl中绘图时无效

C#窗体中要获取C#窗口的句柄不是你抓的那个HALCON/WIN32-200000了,而且在C#中窗口控件有单独的事件,你需要加载到窗口的事件中而不是Click!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| tystq 发表于 2019-6-12 17:31:06 | 显示全部楼层
绝地武士 发表于 2019-6-12 16:36
C#窗体中要获取C#窗口的句柄不是你抓的那个HALCON/WIN32-200000了,而且在C#中窗口控件有单独的事件,你需 ...

大神,经过摸索,发现halcon绘图指令响应的右键是全局的,跟窗口无关,即使你在Excel窗口下点击鼠标右键,也能终止绘图(c#中一样)
[DllImport("user32.dll")]
        private static extern int SetCursorPos(int x, int y);
        /// <summary>
        /// 移动鼠标到指定的坐标点
        /// </summary>
        public void MoveMouseToPoint(Point p)
        {
            SetCursorPos(p.X, p.Y);
        }

//先移动鼠标到this.hWindowControl1左上角是可以的,但是放在Form1_FormClosing中无效,就是用户忘记点鼠标右键后无法退出绘图指令
  MoveMouseToPoint(PointToScreen(this.hWindowControl1.Location));
   mouse_event(0x8 | 0x10, 0, 0, 0, 0);
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表