tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
指定のウインドウをトップ位置に移動しアクティブにする(VB6.0) ( No.0 )  [親スレッドへ]
日時: 2008/10/10 15:39
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[他のアプリ関係][フォーム][]                                        *
* キーワード:最前面,アクティブ,タスクバーが点滅,SetForegroundWindow,SetFocus     *
***********************************************************************************
タイトル :起動時のパスワード画面のテキストが入力できない
投 稿 日 : 2008/08/24(Sun) 14:03
元質問者 : MAKOTO  

MAIN画面を最初に立ち上げた後、パスワード画面を表示した際に
PCの環境が原因か最前面に表示される画面、ツールバーのログインが点滅状態になる。

-----------------------------------------------------------------------------------
記事No : 12957
投稿日 : 2008/08/24(Sun) 18:34
回答者 : 花ちゃん  
-----------------------------------------------------------------------------------
当サイト内外検索で、GetWindowThreadProcessId をキーに検索して見て下さい。

それとも下記のどちらかでしょう。
http://tinyurl.com/3l32qn

-----------------------------------------------------------------------------------
No.2891 Re:Shell関数を使用したアプリケーション起動  投稿者:ゆう(U) [2001/10/06(土)16:07分]

> (ゆう)さん、(ゆー太郎さん) サンプルソースを拝見したいので
ゆう(U) でお願いします。
  ^^^半角

ゆー太郎 さんのオリジナルのコードが見つからないので
私が幾らか改造したコードを載せます。
※動作確認は十二分に行ってください!

ゆう(U) 改良(悪)コード)
Private Declare Function GetForegroundWindow _
                 Lib "user32" () As Long
Private Declare Function SetForegroundWindow _
                 Lib "user32" _
                 (ByVal hWnd As Long) As Long
Private Declare Function GetWindowThreadProcessId _
                 Lib "user32" _
                 (ByVal hWnd As Long, _
                  ByRef lpdwProcessId As Long _
                 ) As Long
Private Declare Function AttachThreadInput _
                 Lib "user32" _
                 (ByVal idAttach As Long, _
                  ByVal idAttachTo As Long, _
                  ByVal fAttach As Long) As Long
Private Declare Function BringWindowToTop _
                 Lib "user32" _
                 (ByVal hWnd As Long) As Long
Private Declare Function IsIconic Lib "user32" _
                 (ByVal hWnd As Long) As Long
Private Declare Function OpenIcon Lib "user32" _
                 (ByVal hWnd As Long) As Long
Private Declare Function FindWindow Lib "user32" _
                  Alias "FindWindowA" _
                 (ByVal lpClassName As String, _
                  ByVal lpWindowName As String) As Long
'==========================================================
'アプリをアクティブ(ForeGround)にする fForeGroundWindow
'==========================================================
' result = fForeGroundWindow(AppName)
' 引数 AppName  :アプリケーション名(終端:vbNullChar)
' 戻値 result   :True   成功
'             :False  失敗
'----------------------------------------------------------
Public Function fForeGroundWindow(ByRef AppName As String) As Boolean
  Dim hWnd As Long
  Dim lngResult As Long

  If InStr(AppName, vbNullChar) = 0& Then
    AppName = AppName & vbNullChar
  End If

  hWnd = FindWindow(vbNullString, AppName)
  If hWnd <> 0& Then
    If IsIconic(hWnd) = False Then
#If Win98 Then
      lngResult = fForeGroundWindow98(hWnd) '98(95OSR2)対策
#Else
      lngResult = SetForegroundWindow(hWnd) '95初期ならOK
#End If
    Else
      lngResult = OpenIcon(hWnd)
      If Not (lngResult = False) Then
''        lngResult = fForeGroundWindow98(hWnd) '?後ろへ行くので
'        lngResult = SetForegroundWindow(hWnd) 'これならOK
#If Win98 Then
      lngResult = fForeGroundWindow98(hWnd) '98(95OSR2)対策
#Else
      lngResult = SetForegroundWindow(hWnd) '95初期ならOK
#End If
      End If
    End If
    fForeGroundWindow = Not (lngResult = False)
  End If
End Function

'==========================================================
'アプリをアクティブ(ForeGround)にするfor98 fForeGroundWindow98
'==========================================================
' result = fForeGroundWindow98(hWnd)
' 引数 hWnd   :アクティブにしたいWindowハンドル
' 戻値 result :SetForegroundWindowの戻値
'----------------------------------------------------------
'※このモジュールは外へ公開しない
'----------------------------------------------------------
Private Function fForeGroundWindow98(ByVal hWnd As Long) As Long
  Dim lngThreadTop As Long
  Dim lngThreadMe As Long
  Dim lnghandle As Long
  Dim lngResult As Long
  Dim lngResult2 As Long

  '現在のアクティブのWindowハンドルを取得
  lnghandle = GetForegroundWindow
'  If lngHandle = hWnd Then
'    '最前面に既にあるなら手前に表示して終了する
'    fForeGroundWindow98 = BringWindowToTop(hWnd)
'    Exit Function
'  End If

  'そのスレッドIDを取得
  lngThreadTop = GetWindowThreadProcessId(lnghandle, ByVal 0&)
  'アクティブにしようとしているWindowハンドルのスレッドを取得
  lngThreadMe = GetWindowThreadProcessId(hWnd, ByVal 0&)
  'スレッドをアタッチする
  lngResult = AttachThreadInput(lngThreadMe, lngThreadTop, 1&)
  '隠れている場合手前に表示する
  lngResult = BringWindowToTop(hWnd)
  'アクティブ(フォアグラウンド)にする
  lngResult2 = SetForegroundWindow(hWnd)
  '戻値を設定
  fForeGroundWindow98 = (lngResult Or lngResult2)
  'スレッドをデタッチする
  lngResult = AttachThreadInput(lngThreadMe, lngThreadTop, 0&)
End Function

----------------------------------------------------------------------------
No.2880 re:Shell関数を使用したアプリケーション起動  投稿者:ゆー太郎 [2001/10/03(水)16:48分]

懐かしいネタですね。(^-^) 確か、Win98が出た頃でしょうか。
Win98から、他プロセスからのアクティブウインドウ変更に制限が
付いたんですよね。
最前面に出ず、アクティブフォーカスもさせず、キャプションバー
を点滅させて、ユーザーに知らせる仕様になったんです。

そこで、「他プロセスから」の制限の裏をかいて、現在アクティブな
プロセスに、前面表示にしたいウインドウのスレッドを一時的にアタッチして、
無理やり アクティブプロセス内でアクティブウィンドウの切り替えを
させるようにしたんでしたよね。

-----------------------------------------------------------------------------
ウェブ全体から検索 の結果
http://frog.raindrop.jp/knowledge/archives/000832.html

SetForegroundWindow で検索して見ても...。
http://www.google.com/search?q=SetForegroundWindow&num=50&hl=ja&filter=0&lr=lang_ja&ie=Shift_JIS



 [スレッド一覧へ] [親スレッドへ]