■63258 / inTopicNo.13) |
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 のやりとりなので 構造体のサイズ問題は起きない気がするのですよね…。
|
|