ウィンドウを最前面に表示(V)(W)          <TOP>


ウィンドウを最前面に表示します。SetForegroundWindowはWindows95、およびWindows98では正常に機能しますが、Windows2000、WindowsXPにおいてはタスクバーで点滅し(仕様:※注参照)、ウィンドウが隠れてしまいます。(W参照)

(V)では、AttachThreadInput、Timerを使って強制的に全面表示させています。

GetForegroundWindow ユーザーが操作中のウィンドウを取得

SetForegroundWindow 指定されたウィンドウをフォアグラウンドにしアクティブにする

GetWindowThreadProcessId ウィンドウのプロセスIDとスレッドIDを取得

AttachThreadInput 別スレッドの子ウィンドウにフォーカスをセット

SystemParametersInfo システム全体に関するパラメータを取得・設定

 

※注

SetForegroundWindow

旧バージョンからの変更により、アプリケーションは、ユーザーが他のウィンドウで作業しているときに強制的にフォアグラウンドウィンドウを設定することはできなくなりました。その代わりに、SetForegroundWindow 関数は、ウィンドウをアクティブにし(SetActiveWindow 関数、FlashWindowEx 関数を呼び出してユーザーに通知します。

 

'================================================================
'= ウィンドウを最前面に(V)
'=    (SetForegroundWindow2.bas)
'================================================================
#include "Windows.bi"

' ユーザーが操作中のウインドウを取得
Declare Function Api_GetForegroundWindow& Lib "user32" Alias "GetForegroundWindow" ()

' 指定されたウィンドウを作成したスレッドをフォアグラウンドにし、そのウィンドウをアクティブにする
Declare Function Api_SetForegroundWindow& Lib "user32" Alias "SetForegroundWindow" (ByVal hWnd&)

' ウィンドウのプロセスIDとスレッドIDを取得
Declare Function Api_GetWindowThreadProcessId& Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hWnd&, lpdwProcessId&)

' 別スレッドの子ウィンドウにフォーカスをセット
Declare Function Api_AttachThreadInput& Lib "user32" Alias "AttachThreadInput" (ByVal idAttach&, ByVal idAttachTo&, ByVal fAttach&)

' システム全体に関するパラメータを取得・設定
Declare Function Api_SystemParametersInfo& Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction&, ByVal uParam&, ByRef lpvParam&, ByVal fuWinIni&)

#define SPI_GETFOREGROUNDLOCKTIMEOUT &H2000 '
#define SPI_SETFOREGROUNDLOCKTIMEOUT &H2001 '
#define apiNull 0
#define apiTrue 1
#define apiFalse 0

Var Shared Timer1 As Object
Timer1.Attach GetDlgItem("Timer1")

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Timer1.SetInterval 5
    Timer1.Enable -1
End Sub

'================================================================
'=
'================================================================
Declare Sub SetAbsoluteForegroundWindow(ByVal hWnd As Long)
Sub SetAbsoluteForegroundWindow(ByVal hWnd As Long)
    Var nTargetID As Long
    Var nForegroundID As Long
    Var sTime As Long
    Var Ret As Long

    '現在のフォアグラウンドウィンドウを作成したスレッドのIDを取得
    nForegroundID = Api_GetWindowThreadProcessId(Api_GetForegroundWindow(), apiNull)

    '目的のウィンドウを作成したスレッドのIDを取得
    nTargetID = Api_GetWindowThreadProcessId(GethWnd, apiNull)

    '入力処理をアタッチ(入力情報を得る)
    Ret = Api_AttachThreadInput(nTargetID, nForegroundID, apiTrue)
  
    '現在の設定をsTimeに保存
    Ret = Api_SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, sTime, 0)

    'ウィンドウの切り替え時間を0msに
    Ret = Api_SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, ByVal 0, 0)

    'ウィンドウをフォアグラウンドに
    Ret = Api_SetForegroundWindow(GethWnd)

    '設定を元に戻す
    Ret = Api_SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, ByVal sTime, 0)

    '入力処理をデタッチ(元に戻す)
    Ret = Api_AttachThreadInput(nTargetID, nForegroundID, apiFalse)
End Sub

'================================================================
'=
'================================================================
Declare Sub Timer1_Timer edecl ()
Sub Timer1_Timer()
    SetAbsoluteForegroundWindow GethWnd
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End

'================================================================
'= ウィンドウを最前面に(W)
'= Windows95、Windows98でのみ可
'= Windows2000、WindowsXPでは最前面にならずタスクバーで点滅
'================================================================
#include "Windows.bi"

' 指定したウィンドウをフォアグラウンドウィンドウに設定
Declare Function Api_SetForegroundWindow& Lib "user32" Alias "SetForegroundWindow" (ByVal hWnd&)

' ウィンドウに関するプロパティを設定
Declare Function Api_SetProp& Lib "user32" Alias "SetPropA" (ByVal hWnd&, ByVal lpString$, ByVal hData&)

' 自分自身のプロセスIDを取得
Declare Function Api_GetCurrentProcessId& Lib "kernel32" Alias "GetCurrentProcessId" ()

Var Shared Timer1 As Object
Timer1.Attach GetDlgItem("Timer1")

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var Ret As Long

    Ret = Api_SetProp(GethWnd, "ProcessID", Api_GetCurrentProcessId)

    Timer1.SetInterval 50
    Timer1.Enable -1
End Sub

'================================================================
'=
'================================================================
Declare Sub Timer1_Timer edecl ()
Sub Timer1_Timer ()
    Var Ret As Long

    Ret = Api_SetForegroundWindow(GethWnd)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End