0

MVC を使用せずに Visual C++ で小さな Windows アプリケーションを作成しています。非常に小さく、1 つのテキスト フィールド、OK ボタン、およびキャンセル ボタンが含まれているだけです。

ユーザーが印刷を開始すると、アプリケーションはバックグラウンド プロセスによって開始されます。アプリケーションを開いてもフォーカスが得られず、表示されません。

ユーザーにとっては、アプリケーションが直接フォーカスされていることが重要です。そのため、アプリケーションを使用するためのリース クリックをできるだけ多く持つことができます。

アプリケーションに焦点を当てるために、多くのことを試しました。

SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetForegroundWindow(hWnd);
ShowWindow(hWnd, SW_RESTORE);
SetFocus(hWnd);

タイマーでこの呼び出しを繰り返しました。これはすべて機能しません。今、MSDNでいくつかの発言を見つけました:

システムは、フォアグラウンド ウィンドウを設定できるプロセスを制限します。プロセスは、次の条件のいずれかに該当する場合にのみ、フォアグラウンド ウィンドウを設定できます。

The process is the foreground process.
The process was started by the foreground process.
The process received the last input event.
There is no foreground process.
The foreground process is being debugged.
The foreground is not locked (see LockSetForegroundWindow).
The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
No menus are active.

誰でもこれの回避策を知っていますか?

4

3 に答える 3

4

これに対する回避策はありません。この新しい Windows の動作の要点は、アプリケーションが勝手にフォアグラウンドに移動して迷惑にならないようにすることです。あなたの場合、通知アイコンを使用し、必要に応じてウィンドウの代わりにバルーン メッセージを表示することをお勧めします。ただし、この場合でも、通知アイコンはユーザーによって非表示になる可能性があり、上記と同じ理由で回避策はありません。

于 2012-06-13T05:24:53.910 に答える
0

さて、これは Visual C++ 開発者ではなく Java 開発者によるものですが、フレーム/ウィンドウ/Visual C で呼び出されたものを常に一番上に設定することはできますか? Java ではJFrame、たとえばがある場合myJFrame、呼び出すことができ、myJFrame.setAlwaysOnTop(true)他のすべてのウィンドウの上に表示されます。これは問題の簡単な回避策のようですが、画面上の何かをブロックしている場合、ユーザーにとって望ましくない場合があります。

于 2012-06-13T05:24:23.140 に答える
0

http://www.thescarms.com/vbasic/alttab.aspxは仕事をしているようです

void forceToFront(HWND hWnd) {
HWND foregroundWindow = GetForegroundWindow();

if (foregroundWindow == hWnd) {
    // Window is already Foreground-window
    return;
}

if (SetForegroundWindow(hWnd)) {
    // could set window to foreground without any tricks
    return;
}

// attach thread of foreground-window to this window
DWORD foregroundThread = GetWindowThreadProcessId(foregroundWindow, NULL);
DWORD myThread = GetWindowThreadProcessId(hWnd, NULL);
AttachThreadInput(foregroundThread, myThread, true);
SetForegroundWindow(hWnd);
AttachThreadInput(foregroundThread, myThread, false);

}

于 2012-06-13T18:12:00.413 に答える