明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2580|回复: 5

[界面] 关于前台窗口的解决方法

[复制链接]
发表于 2011-8-19 22:01 | 显示全部楼层 |阅读模式
     最近做了一个小程序,要从自己编写的小程序切换到AutoCAD窗口,当然用alt+tab也可以切换,现在想自动切换,以前用vb的时候知道怎么做,现在用vb.net了。到网上搜了好久也没有看到好方法,呵呵,就把以前的vb代码升级了一下,大家看着用。。有好方法的告诉我一声。。
   代码示例:要求新建一个窗体应用程序项目,在form1里面添加一个Button1按钮,复制下面代码,运行点击button1,切换到autocad窗口,在cad窗体上面选择一点,然后返回到form窗口。
  1. Public Class Form1
  2.     Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Integer, ByRef lpdwProcessId As Integer) As Integer
  3.     Private Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Integer, ByVal idAttachTo As Integer, ByVal fAttach As Integer) As Integer
  4.     Private Declare Function GetForegroundWindow Lib "user32" () As Integer
  5.     Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Integer) As Integer
  6.     Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Integer) As Integer
  7.     Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Integer, ByVal nCmdShow As Integer) As Integer
  8.     Private Const SW_SHOW As Short = 5
  9.     Private Const SW_RESTORE As Short = 9
  10.     Public Function ForceForegroundWindow(ByVal hWnd As Integer) As Boolean
  11.         Dim ThreadID1 As Integer ' 线程ID
  12.         Dim ThreadID2 As Integer ' 线程ID
  13.         Dim nRet As Integer
  14.         '  如果指定的窗体已经在前台,不做任何操作
  15.         If hWnd = GetForegroundWindow() Then
  16.             ForceForegroundWindow = True
  17.         Else
  18.             ' 首先获得指定窗体相关的线程和当前前台窗口所在的线程
  19.             ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow, 0)
  20.             ThreadID2 = GetWindowThreadProcessId(hWnd, 0)
  21.             ' 通过共享输入状态,两个线程分享当前窗口
  22.             If ThreadID1 <> ThreadID2 Then
  23.                 Call AttachThreadInput(ThreadID1, ThreadID2, True)
  24.                 nRet = SetForegroundWindow(hWnd)
  25.                 Call AttachThreadInput(ThreadID1, ThreadID2, False)
  26.             Else
  27.                 nRet = SetForegroundWindow(hWnd)
  28.             End If
  29.             '恢复和重画
  30.             If IsIconic(hWnd) Then
  31.                 Call ShowWindow(hWnd, SW_RESTORE)
  32.             Else
  33.                 Call ShowWindow(hWnd, SW_SHOW)
  34.             End If
  35.             '  精确地返回函数执行结果
  36.             ForceForegroundWindow = CBool(nRet)
  37.         End If
  38.     End Function
  39.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  40.         Dim myAcadApp As Object
  41.         myAcadApp = GetObject(, "Autocad.Application") '获得autocad程序
  42.         ' myAcadApp = GetObject(, "Excel.Application")'如果想切换到excel窗口,用这句代码
  43.         ForceForegroundWindow(myAcadApp.hWnd)
  44.         myAcadApp.ActiveDocument.Utility.GetPoint(, "选择一点:")
  45.         ForceForegroundWindow(Me.Handle)
  46.     End Sub
  47. End Class




.net2008源码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2011-8-19 23:44 | 显示全部楼层
呃,都窗口句柄了。
你写的程序是独立于AutoCAD的吗?还是使用插件的方式?要是是插件的话,就容易多了
 楼主| 发表于 2011-8-20 09:05 | 显示全部楼层
cdinten 发表于 2011-8-19 23:44
呃,都窗口句柄了。
你写的程序是独立于AutoCAD的吗?还是使用插件的方式?要是是插件的话,就容易多了

程序是独立的,输出到cad只是里面的一个功能。。
发表于 2011-8-20 11:48 | 显示全部楼层
AppActivate(myAcadApp.Caption)
 楼主| 发表于 2011-8-21 11:22 | 显示全部楼层
河伯 发表于 2011-8-20 11:48
AppActivate(myAcadApp.Caption)

这个好像不会切换,只是任务栏了autocad变成亮色了。。。
发表于 2011-8-21 22:58 | 显示全部楼层
这是共享线程的方法,在张帆斑竹的书中有介绍
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 16:09 , Processed in 0.308111 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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