明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1070|回复: 4

VB窗口中一个命令调用另一命令

[复制链接]
发表于 2017-9-11 11:52:13 | 显示全部楼层 |阅读模式
本帖最后由 Kye 于 2020-5-29 21:35 编辑

读这个贴【请问能将cad窗口设为当前窗口吗】http://bbs.mjtd.com/forum.php?mod=viewthread&tid=110889&fromuid=7303474
想将exe窗口调用至前台,捣鼓了一天,百度到一句话任务栏的窗口API 中的bringwindowtotop SetWindowPos SetForegroundWindow无法实现将其调至前台,遂放弃

从这个https://zhidao.baidu.com/question/1493962773300152419.htmlhttp://bbs.csdn.net/topics/390328728 学习了可以用如题的用法,实现了VB--->LSP---->VB




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;分割线2020-05-29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;仅仅填加了备注,程序无实际变化 当年写这句VB--->LSP---->VB 现在看来我自己都有点莫名其妙
'一般情况下,VB中运行lisp命令只能放入程序的末端如Command1<VB其他内容+LISP 构成了完整VB命令>
'此程序示例实现了lisp命令前置即 [完整VB 命令<LISP命令>]+[VB其他内容构成一个新的VB命令
'也就是VB命令==[完整VB 命令<LISP命令>]+[VB其他内容] 完成 lisp命令前置


  1. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
  2.      ByVal lpClassName As String, _
  3.      ByVal lpWindowName As String) As Long
  4. Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _
  5.      ByVal hWnd1 As Long, _
  6.      ByVal hWnd2 As Long, _
  7.      ByVal lpsz1 As String, _
  8.      ByVal lpsz2 As String) As Long
  9. Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" ( _
  10.      ByVal hwnd As Long, _
  11.      ByVal wMsg As Long, _
  12.      ByVal wParam As Long, _
  13.      ByVal lParam As Long) As Long
  14. Private Const WM_LBUTTONDOWN As Long = &H201
  15. Private Const WM_LBUTTONUP As Long = &H202
  16. Dim hDest As Long           '目标按钮句柄
  17. Private Sub Command1_Click()
  18. On Error GoTo ErrHandler

  19.    
  20.    
  21. '''连接cad
  22.     Dim acadapp As Object  'AcadApplication
  23.     Dim Thisdrawing As Object  'AcadDocument
  24.    ' Dim thisDrawing As Object
  25.     Set acadapp = GetObject(, "AutoCAD.Application")
  26.     If Err Then
  27.         Err.Clear
  28.         Set acadapp = CreateObject("AutoCAD.Application")
  29.         If Err Then
  30.             MsgBox Err.Description
  31.             End
  32.             Exit Sub
  33.         End If
  34.     End If
  35.     acadapp.Visible = True
  36.     Set Thisdrawing = acadapp.ActiveDocument
  37.     Thisdrawing.SendCommand "TEST" & vbCr '应该改进cad程序运行成功应该将这些数据从库中删除

  38. ErrExit:
  39.    
  40.     Exit Sub
  41.    
  42. ErrHandler:
  43.     MsgBox "运行时发生意外,请检查AutoCAD文件是否打开!", vbCritical, "提示"
  44.     GoTo ErrExit
  45. End Sub
  46. Private Sub Command2_Click()
  47. MsgBox "测试怎么样?"
  48. End Sub
  49. Private Sub Command3_Click()'==================================================
  50. '时间长了,加个备注<2020-05-29>
  51. '1.  form_load的内容<示例中调用command2>,同理 也可实现调用Command1
  52. '2.  如调用command1的内容<即lisp>,也就是lisp命令可以前置 ,再运行其他vb内容
  53. '==================================================
  54. End Sub
  55. Private Sub Form_Load()
  56. '==================================================
  57. '时间长了,加个备注<2020-05-29>
  58.   '通过form_load启动调用了 command2 命令,如将form_load的内容放入一个命令Command3中,
  59.   '即Command3可以调用command2 命令
  60. '==================================================

  61.    '寻找按钮句柄
  62.     '
  63.     '具体代码内容根据软件的结构不同而不同,参考SPY++中目标软件的结构图
  64.     '
  65.     Dim hTmp As Long
  66.    

  67.     hTmp = FindWindow(vbNullString, "12345") '    12345 为窗体名字' findwindow(vbnullstring,"窗体名字")
  68.    
  69.     If hTmp <> 0 Then
  70.          hDest = FindWindowEx(hTmp, 0, vbNullString, "Command2")     
  71.          End If
  72.    If hDest <> 0 Then
  73.         SendClick hDest, 10, 10              '
  74.     Else
  75.         MsgBox "还未找到句柄!"
  76.     End If
  77. End Sub
  78. Private Function SendClick(hwnd As Long, mX As Long, mY As Long)
  79.     '发送点击消息
  80.     Dim I As Long
  81.     I = PostMessage(hwnd, WM_LBUTTONDOWN, 0, (mX And &HFFFF) + (mY And &HFFFF) * &H10000)
  82.     I = PostMessage(hwnd, WM_LBUTTONUP, 0, (mX And &HFFFF) + (mY And &HFFFF) * &H10000)
  83. End Function







发表于 2017-9-11 12:58:33 | 显示全部楼层
Appactivate acadapp.Caption
 楼主| 发表于 2017-9-11 14:23:35 | 显示全部楼层
本帖最后由 Kye 于 2017-9-11 14:25 编辑
zzyong00 发表于 2017-9-11 12:58
Appactivate acadapp.Caption

阿勇老师的东西很很高端,是不是调用CAD窗口至当前?请阿勇老师给一个示例链接 谢谢

最初想实现在CAD中调用任务栏中的exe窗口至前台,未实现,只好用taskkill 关闭进程,重启命令

主楼的程序是想分享下 在同一个窗口下,一个命令调用另外一个命令的示例,或许论坛上有,不过没有看到,这个示例程序还是有点用处.比如sendcommand lisp程序只能放在最后,如果在lisp程序后面还想再做点什么之类就可以用这个调用下 呵呵
发表于 2017-9-11 17:25:04 | 显示全部楼层
zzyong00说的是对的
用CAD2006作的实验,代码如下:
'将cad激活到当前
Private Sub Command1_Click()
Appactivate "AutoCAD"
End Sub

评分

参与人数 1明经币 +1 收起 理由
Kye + 1 很给力!

查看全部评分

发表于 2017-10-7 19:22:18 | 显示全部楼层
回帖是一种美德!感谢楼主的无私分享 谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 09:31 , Processed in 0.154155 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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