ウィンドウを前景にしようとしています。私はこのコードを使用しています。しかし、うまくいきません。誰か助けてくれませんか?
ShowWindowAsync(wnd.hWnd, SW_SHOW);
SetForegroundWindow(wnd.hWnd);
// Code from Karl E. Peterson, www.mvps.org/vb/sample.htm
// Converted to Delphi by Ray Lischner
// Published in The Delphi Magazine 55, page 16
// Converted to C# by Kevin Gale
IntPtr foregroundWindow = GetForegroundWindow();
IntPtr Dummy = IntPtr.Zero;
uint foregroundThreadId = GetWindowThreadProcessId(foregroundWindow, Dummy);
uint thisThreadId = GetWindowThreadProcessId(wnd.hWnd, Dummy);
if (AttachThreadInput(thisThreadId, foregroundThreadId, true))
{
BringWindowToTop(wnd.hWnd); // IE 5.5 related hack
SetForegroundWindow(wnd.hWnd);
AttachThreadInput(thisThreadId, foregroundThreadId, false);
}
if (GetForegroundWindow() != wnd.hWnd)
{
// Code by Daniel P. Stasinski
// Converted to C# by Kevin Gale
IntPtr Timeout = IntPtr.Zero;
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, Timeout, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Dummy, SPIF_SENDCHANGE);
BringWindowToTop(wnd.hWnd); // IE 5.5 related hack
SetForegroundWindow(wnd.hWnd);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Timeout, SPIF_SENDCHANGE);
}
コードの説明
ウィンドウをフォアグラウンド ウィンドウにするには、SetForegroundWindow API を呼び出すだけでは不十分です。最初にフォアグラウンド スレッドを決定し、AttachThreadInput を使用してそれをウィンドウにアタッチしてから、SetForegroundWindow を呼び出す必要があります。そうすれば、入力状態を共有できます。
まず、GetForegroundWindow を呼び出して、現在のフォアグラウンド ウィンドウのハンドルを取得します。次に、GetWindowThreadProcessId を数回呼び出して、現在のフォアグラウンド ウィンドウに関連付けられているスレッドと、フォアグラウンドに表示するウィンドウを取得します。これらのスレッドが同じ場合は、SetForegroundWindow を呼び出すだけで十分です。そうしないと、フォアグラウンド スレッドが前面に移動するウィンドウにアタッチされ、現在のフォアグラウンド ウィンドウから切り離されます。これは、AttachThreadInput API が処理します。
ここから取得したコンテンツ ありがとうございます。