乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 73|回复: 5

关于前台窗口的解决方法

[复制链接]

7

主题

15

帖子

3

银币

初来乍到

Rank: 1

铜币
43
发表于 2011-8-19 22:01:00 | 显示全部楼层 |阅读模式
最近做了一个小程序,要从自己编写的小程序切换到窗口,当然用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源码

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

19

主题

154

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

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

使用道具 举报

7

主题

15

帖子

3

银币

初来乍到

Rank: 1

铜币
43
发表于 2011-8-20 09:05:00 | 显示全部楼层

程序是独立的,输出到cad只是里面的一个功能。。
回复

使用道具 举报

13

主题

84

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2011-8-20 11:48:00 | 显示全部楼层
AppActivate(myAcadApp.Caption)
回复

使用道具 举报

7

主题

15

帖子

3

银币

初来乍到

Rank: 1

铜币
43
发表于 2011-8-21 11:22:00 | 显示全部楼层

这个好像不会切换,只是任务栏了autocad变成亮色了。。。
回复

使用道具 举报

8

主题

138

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
170
发表于 2011-8-21 22:58:00 | 显示全部楼层
这是共享线程的方法,在张帆斑竹的书中有介绍
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 15:05 , Processed in 2.567657 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表