задача такая, имеется некая бухгалтерская программа, ThreadID2, окно Prog_Form_hWnd.
и моя программа, ThreadID1, окно MyForm_hWnd
Над Бухгалтерской программой постоянно должно висеть мое окно маленького размера MyForm , причем обязательно в положении HWND_TOPMOST, но если рабочий паток не мой ThreadID1, и не программы ThreadID2, то не должно быть вмешательства в систему (в Zorder).
нет сабклассинга, нет хуков (вернее сабклассинг только на моем окне MyForm_hWnd).
решаю так, сидит таймер, интервал 100мс, а в обработке следующий код:
- Код: Выделить всё
CurrentThreadID = GetWindowThreadProcessId(GetForegroundWindow, ByVal 0&)
If CurrentThreadID = ThreadID1 Then '"myForm"
If GetWindow(Prog_Form_hWnd, GW_HWNDPREV) <> MyForm_hWnd Then
SetWindowPos Prog_Form_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
SetWindowPos MyForm_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End If
ElseIf CurrentThreadID = ThreadID2 Then '"prog Form"
If GetWindow(Prog_Form_hWnd, GW_HWNDPREV) <> MyForm_hWnd Then
SetWindowPos MyForm_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End If
Else
' “случай, когда постороннее окно активировали, по идее MyForm_hWnd должен потерять TOPMOST свойство”
' “проблемное место”
SetWindowPos MyForm_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NOSIZE
End If
кроме этого
в WindowProc моего окна в сообщении WA_INACTIVE сидит
- Код: Выделить всё
SetWindowPos MyForm_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
Проблема в “проблемном месте”, (когда активировали чужое окно, процесс которого не наш и не бухг. программы),
1. если до этого активное было MyForm, все работает нормально, так как WindowProc WA_INACTIVE успевает перевести состояние топмость в HWND_NOTOPMOST и “чужое” окно оказывается сверху, как и положено в Windows для Foreground окна.
2. но если до этого активное было окно бухг. программы, то увы, в “проблемном месте”, MyForm опять сверху над “чужим” окном, хотя со свойством HWND_NOTOPMOST. Она приобретает это свойство только после того как “чужое” окно отрисовалось на второй позиции.
может, предложите решение. Хук окна бухгалтерской программы исключается.