Module1.bas
上传用户:yayuwl
上传日期:2022-03-18
资源大小:8952k
文件大小:2k
源码类别:

CAD

开发平台:

VBA

  1. Attribute VB_Name = "Module1"
  2. Option Explicit
  3. Private Declare Function GetWindowThreadProcessId Lib "user32" _
  4.     (ByVal hWnd As Long, lpdwProcessId As Long) As Long
  5. Private Declare Function AttachThreadInput Lib "user32" _
  6.     (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
  7. Private Declare Function GetForegroundWindow Lib "user32" () As Long
  8. Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
  9. Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Long) As Long
  10. Private Declare Function ShowWindow Lib "user32" _
  11.     (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
  12. Private Const SW_SHOW = 5
  13. Private Const SW_RESTORE = 9
  14. Public Function ForceForegroundWindow(ByVal hWnd As Long) As Boolean
  15.    Dim ThreadID1 As Long    ' 线程ID
  16.    Dim ThreadID2 As Long    ' 线程ID
  17.    Dim nRet As Long
  18.    
  19.    ' 如果指定的窗体已经在前台,不做任何操作
  20.    If hWnd = GetForegroundWindow() Then
  21.       ForceForegroundWindow = True
  22.    Else
  23.       ' 首先获得指定窗体相关的线程和当前前台窗口所在的线程
  24.       ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow, ByVal 0&)
  25.       ThreadID2 = GetWindowThreadProcessId(hWnd, ByVal 0&)
  26.       
  27.       ' 通过共享输入状态,两个线程分享当前窗口
  28.       If ThreadID1 <> ThreadID2 Then
  29.          Call AttachThreadInput(ThreadID1, ThreadID2, True)
  30.          nRet = SetForegroundWindow(hWnd)
  31.          Call AttachThreadInput(ThreadID1, ThreadID2, False)
  32.       Else
  33.          nRet = SetForegroundWindow(hWnd)
  34.       End If
  35.       
  36.       ' 恢复和重画
  37.       If IsIconic(hWnd) Then
  38.          Call ShowWindow(hWnd, SW_RESTORE)
  39.       Else
  40.          Call ShowWindow(hWnd, SW_SHOW)
  41.       End If
  42.       
  43.       ' 精确地返回函数执行结果
  44.       ForceForegroundWindow = CBool(nRet)
  45.    End If
  46. End Function