- 日時: 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
|