■掲示板に戻る■ 全部 1- 101- 最新50
【質問】プログラマー用総合質問スレ【Win32】

82 :LACHE@AoA:04/09/10 22:47 ID:8qOZmi7k
UOをプレイしているときに、あるタイミングで、
別のウィンドウ(UOLinkの生成したウィンドウ)を前面に表示したいのですが、
やり方がわからなくて困っています。
SetForgroundWindow()やSetFocus()、SetActiveWindow()は駄目でした…
どう駄目かといいますと、それらのAPIを使用してもタスクバー内で点滅するだけで
前面に表示されないのです。

あるサイトで、win2000以降はAPIがそういう仕様になり
ForgroundWindow()を使用する前にプロセスを
アタッチしなければならないとありました。

で、AttachThreadInput()を使用してみたところ…
UOLinkもClientも落ちてしまいました。

もしかしてフックしているのがまずいのか!?
と思ったり…。

というわけで、前面に表示するよい方法がありましたらご教授頂けないでしょうか。
よろしくおねがいします。

83 :LACHE@AoA:04/09/10 22:50 ID:8qOZmi7k
問題のソースです。
どこかのサイトからのパクリです^^;

void SetAbsoluteForegroundWindow( HWND hWnd ) {

int nTargetID, nForegroundID;
DWORD sp_time;

// フォアグラウンドウィンドウを作成したスレッドのIDを取得
nForegroundID = GetWindowThreadProcessId( GetForegroundWindow(), NULL );
// 目的のウィンドウを作成したスレッドのIDを取得
nTargetID = GetWindowThreadProcessId( hWnd, NULL );

// スレッドのインプット状態を結び付ける
AttachThreadInput( nTargetID, nForegroundID, TRUE ); // TRUE で結び付け

// 現在の設定を sp_time に保存
SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &sp_time, 0 );
// ウィンドウの切り替え時間を 0ms にする
SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, 0 );

// ウィンドウをフォアグラウンドに持ってくる
SetForegroundWindow( hWnd );

// 設定を元に戻す
SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, &sp_time, 0 );

// スレッドのインプット状態を切り離す
AttachThreadInput( nTargetID, nForegroundID, FALSE ); // FALSE で切り離し

} // SetAbsoluteForgroundWindow

33KB
続きを読む

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail(省略可)

0ch BBS 2007-01-24