C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 107 を表示中)
■63258 / )  Re[5]: ForegroundLockTimeoutの取得
□投稿者/ 魔界の仮面弁士 (18回)-(2012/08/08(Wed) 15:56:52)
No63253 (?V???E?X さん) に返信
…Cookie 腐敗?

> 魔界の仮面弁士さんご本人の以前のレスですが、上記の手順が必要そうです?
実の所、当初のコードではそれに近い手順で記述されていたりします。
一番最初に書いたコードは、下記のコンソールアプリです。(変数宣言等は省きます)


activeWindow = GetForegroundWindow();
dwForegroundThread = GetWindowThreadProcessId(activeWindow, out dwProcessId);
// dwTargetThread = GetWindowThreadProcessId(handle, out dwProcessId);
dwTargetThread = GetCurrentThreadId();

if (dwTargetThread == dwCurrentThread) {
ret = SetForegroundWindow(handle);
} else {
ret = AttachThreadInput(dwCurrentThread, dwForegroundThread, true);
//ret = AllowSetForegroundWindow(ASFW_ANY);
ret = AllowSetForegroundWindow(dwTargetThread);
ret = SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, out sp_timeout, 0); // ★
ret = SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, IntPtr.Zero, 0);
//ret = SetForegroundWindow(handle);
ret = BringWindowToTop(handle);
ret = SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (IntPtr)sp_timeout, 0);
ret = AttachThreadInput(dwCurrentThread, dwForegroundThread, false);
}


IntPtr 変数『handle』が、手前に表示させたいアプリのHWNDです。
この HWND は、コマンドライン引数経由で C# に渡されています。

そしてこの C# アプリの呼び出し元は wsf 上の VBScript。
WshShell.Run 経由で C# アプリを呼び出し、コマンドライン引数に
Excel.Application オブジェクトの Hwnd プロパティの値を渡しています。


また、上記は Visual Studio 上でのステップ実行等では無く、
Releaseビルドの exe を、直接 VBScript から起動させることで
動作検証を行っています。


…ところが動作ログを確認すると、何故か ★ の部分が固定値 0x00000000 で
返されている事がわかりました(そのため、設定が復元できずに 0 のままになってしまう)。

そこで、SystemParametersInfo API の呼び出し部分のみを切り出し、
さらに他言語(VB6/VB.NET)も担ぎ出して検証調査を行っている状況です。


> http://d.hatena.ne.jp/NyaRuRu/20080303/p1
> http://d.hatena.ne.jp/firewood/mobile?date=20080304
> こんな話もあるようです。
おぉ、これは読んだことがなかったです。ありがとうございます。

しかし ForegroundLockTimeout の場合、単純な (LP)DWORD のやりとりなので
構造体のサイズ問題は起きない気がするのですよね…。
返信 編集キー/


管理者用

- Child Tree -