powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Стабильное переключение в другое приложение
12 сообщений из 12, страница 1 из 1
Стабильное переключение в другое приложение
    #39968399
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, товарищи!
Подскажите, пожалуйста, как можно гарантированно переключиться в приложение?
Уже полдня просидел, так ничего не могу сообразить.

Написал такой код, но он не всегда срабатывает. Скорее не срабатывает.
Надо, чтобы была 100% гарантия, что приложение будет на переднем плане.

Подскажите, пожалуйста, как это сделать?
Я весь интернет уже облазил, ничего не могу найти.

На заднем плане нужная программа появляется, раскрывается, но как её на передний план поставить?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
Option Explicit

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type


Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Type WINDOWPLACEMENT
    Length As Long
    flags As Long
    showCmd As Long
    ptMinPosition As POINTAPI
    ptMaxPosition As POINTAPI
    rcNormalPosition As RECT
End Type


Private Const SW_NORMAL = 1
Private Const SW_MAXIMIZE = 3 ' Развернуть окно
Private Const SW_RESTORE = 9 ' Активизировать и отобразить окно. Если окно свернуто или развернуто, Windows восстанавливает его исходный размер и положение
Private Const SW_SHOW = 5 ' Активизировать окно

Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_SHOWWINDOW = &H40

Private Const HWND_TOP = 0

Private Declare Function GetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
Private Declare Function SetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long


Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long


Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long


Private Declare Function OpenIcon Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetFocusApp Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function SetActiveWindow Lib "user32" (ByVal hwnd As Long) As Long


Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long




Private Sub WndShow(ByVal hWnd_x As Long)

OpenIcon hWnd_x
ShowWindow hWnd_x, SW_SHOW
ShowWindow hWnd_x, SW_NORMAL
SetActiveWindow hWnd_x
SetFocusApp hWnd_x

SetForegroundWindow hWnd_x
ShowWindow hWnd_x, SW_RESTORE
ShowWindow hWnd_x, 10

End Sub



Private Sub SetWindowState(ByVal hWnd_x As Long)

Dim lWindowState As Long
Dim tWinPlace As WINDOWPLACEMENT



Dim tek_hWnd As Long
Dim tek_hWnd1 As Long



tWinPlace.Length = Len(tWinPlace)
Call GetWindowPlacement(hWnd_x, tWinPlace)

tWinPlace.showCmd = SW_NORMAL
Call SetWindowPlacement(hWnd_x, tWinPlace)


WndShow hWnd_x

SetWindowPos hWnd_x, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE Or SWP_SHOWWINDOW



tek_hWnd = GetForegroundWindow
If tek_hWnd <> hWnd_x And GetParent(tek_hWnd) = 0 Then WndShow hWnd_x

tek_hWnd1 = GetActiveWindow
If tek_hWnd1 <> hWnd_x And GetParent(tek_hWnd1) = 0 Then WndShow hWnd_x




End Sub

Private Sub Timer1_Timer()

Dim hWnd_x As Long


ShellExecute Form1.hwnd, "Open", App.Path & "\1.txt", 0, 0, SW_NORMAL


hWnd_x = FindWindow(vbNullString, "1.txt - AkelPad")

SetWindowState hWnd_x

End Sub
...
Рейтинг: 0 / 0
Стабильное переключение в другое приложение
    #39968403
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не помню точно, но вроде ShellExecute работает асинхронно
то есть на момент FindWindow программа могла еще не запуститься.
Попробуйте для начала задержку после ShellExecute, чтобы понять, в этом ли дело.
...
Рейтинг: 0 / 0
Стабильное переключение в другое приложение
    #39968430
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

не помогло
...
Рейтинг: 0 / 0
Стабильное переключение в другое приложение
    #39968434
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FindWindow находит окно? Или возвращает 0?
...
Рейтинг: 0 / 0
Стабильное переключение в другое приложение
    #39968435
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

всё работает, только окно мигает внизу на панели, а показываться не хочет
...
Рейтинг: 0 / 0
Стабильное переключение в другое приложение
    #39968689
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Don Salieri,

IMHO то что вы хотите не должно работать в принципе.
Вы жалуетесь что дыра в безопасности системы не работает.
Если сработает сейчас то не факт что это не очередного патчя.

Представьте что у вас получилось, а это значит что любой программе можно перехватить фокус когда вы вводите пароль в фаерфоксе или ещё где.
...
Рейтинг: 0 / 0
Стабильное переключение в другое приложение
    #39968693
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё одна подсказка. Важно кто родитель прцесса.
...
Рейтинг: 0 / 0
Стабильное переключение в другое приложение
    #39968715
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Стабильное переключение в другое приложение
    #39968726
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ATM-TURBO 2,

Нашёл какой-то пример.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub SetForegroundWindowEx(ByVal hWnd As Long)
    Dim MyThreadID As Long, ActiveThreadID As Long

    MyThreadID = GetCurrentThreadId() ' Получение ID нашего потока
    ActiveThreadID = GetWindowThreadProcessId(GetForegroundWindow, 0) ' Получение ID потока активного в данный момент окна

    Call AttachThreadInput(MyThreadID, ActiveThreadID, vbNull) ' Присоединяемся к потоку, окно которого в данный момент активно
    Call SetForegroundWindow(hWnd) ' Теперь мы имеем полное право выйти из сумрака ;)
    Call AttachThreadInput(MyThreadID, ActiveThreadID, 0) ' Более не имеет смысла держаться за поток чьё окно БЫЛО активным ;)
End Sub
...
Рейтинг: 0 / 0
Стабильное переключение в другое приложение
    #39968915
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то сделал, вроде, стало лучше. Но у меня вопрос: если это моё приложение, оно будет стабильнее работать? Просто я разницы особо не заметил, своё (сам себя) или чужое раскрывать/скрывать.
Заметил особенность: после появление окна, оно серое (неактивное), пока не сделаешь клик там.
Я осуществил такое решение, но оно слишком безобразное. Нельзя ли как-то клик в приложении осуществить более цивилизованным образом?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
If GetForegroundWindow = hWnd_x And GetActiveWindow = hWnd_x Then

GetCursorPos coord_old

WindowGetCoord hWnd_x, coord_x, coord_y, 0, 0

SetCursorPos coord_x, coord_y

mouse_event MOUSEEVENTF_LEFTDOWN, coord_x, coord_y, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, coord_x, coord_y, 0, 0

SetCursorPos coord_old.x, coord_old.y

End If



Общее итоговое решение потом размещу в конце, как решу эту задачу.
...
Рейтинг: 0 / 0
Стабильное переключение в другое приложение
    #39970972
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смастерил как-то, не знаю, мне кажется, лучше не будет. Тут надо разбираться в деталях, а я в них никак не разбираюсь.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
Public Sub WindowSetState(ByVal hWnd_x As Long, ByVal WindState As WNDSTATE, Optional ByVal SW As SWS = 0)


' ShowNative = 0 ' разворачивание простое
'  = 1 ' разворачивание сложное (сворачивает текущее приложение)
' MinNative = 2 ' сворачивание простое



Dim tek_hWnd As Long
Dim tek_hWnd1 As Long


 Dim lWindowState As Long
 Dim tWinPlace As WINDOWPLACEMENT
 
 
 

    Dim currentThread As Long
    Dim activeThread As Long
    Dim windowThread As Long
    
    Dim activeWindow As Long
    
    Dim activeProcess As Long
    Dim windowProcess As Long
    
    
    
     Dim oldTimeout As Long
     Dim newTimeout As Long



 'LockSetForegroundWindow LSFW_UNLOCK   ''''''Unlock setforegroundwindow calls
      '  apiAllowSetForegroundWindow (ASFW_ANY) ''''''''Allow setforeground window calls
       ' KeyEvent( VK_MENU, False, True, -12) '''''''''''''''Lift menu key if pressed, and it also allows the foreground window to be set
       ' ForceForeground = CBool(apiSetForegroundWindow(hwnd)) 'Set foreground window
       ' apiLockSetForegroundWindow (LSFW_LOCK) ''''''''Lock other apps from using setforegroundwindow

If lpPrevWndProc <= 0 Then


    currentThread = GetCurrentThreadId
    activeWindow = GetForegroundWindow
    activeThread = GetWindowThreadProcessId(activeWindow, activeProcess)
    windowThread = GetWindowThreadProcessId(hWnd_x, windowProcess)
    
    If currentThread <> activeThread Then AttachThreadInput currentThread, activeThread, True
    If windowThread <> currentThread Then AttachThreadInput windowThread, currentThread, True
    

    Call SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0&, oldTimeout, 0)
    Call SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0&, newTimeout, 0)
    
    LockSetForegroundWindow LSFW_UNLOCK
    AllowSetForegroundWindow ASFW_ANY



Sleep 200

'End If


 
' Form1.Label10.Caption = MyThreadID
 ' Form1.Label11.Caption = ActiveThreadID
 ' Form1.Label12.Caption = AttachThread
 End If



  tWinPlace.Length = Len(tWinPlace)
 Call GetWindowPlacement(hWnd_x, tWinPlace)



'AppMinAll

If SW = 0 Then ' разворачивание простое

WNDShow hWnd_x, WindState


ElseIf SW = 1 Then ' разворачивание сложное

WNDShow hWnd_x, WindState


tek_hWnd = GetForegroundWindow

If tek_hWnd <> hWnd_x And GetParent(tek_hWnd) = 0 Then

WNDShow hWnd_x, WindState
ShowWindow tek_hWnd, SW_MINIMIZE

End If


tek_hWnd1 = GetActiveWindow

If tek_hWnd1 <> hWnd_x And GetParent(tek_hWnd1) = 0 Then

WNDShow hWnd_x, WindState
ShowWindow tek_hWnd1, SW_MINIMIZE

End If




ElseIf SW = 2 Then ' сворачивание простое

 ShowWindow hWnd_x, WindState

End If



'If tWinPlace.showCmd <> WindState Then
    tWinPlace.showCmd = WindState
    Call SetWindowPlacement(hWnd_x, tWinPlace)
'End If


    Call SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0&, oldTimeout, 0)
    
    If currentThread <> activeThread Then AttachThreadInput currentThread, activeThread, False
    If windowThread <> currentThread Then AttachThreadInput windowThread, currentThread, False




End Sub

Public Sub WNDShow(ByVal hWnd_x As Long, ByVal WindState As WNDSTATE)


Dim coord_x As Integer
Dim coord_y As Integer

Dim coord_old As POINTAPI


Dim SW As LogVar



If WindState = SW_RESTORE Or WindState = SW_NORMAL Or WindState = SW_SHOW Or WindState = SW_MAXIMIZE Then
SW = 1
Else
SW = 0
End If



OpenIcon hWnd_x



'#################################
SetForegroundWindow hWnd_x
SetActiveWindow hWnd_x
BringWindowToTop hWnd_x
ShowWindow hWnd_x, SW_RESTORE
'#################################


ShowWindow hWnd_x, 10
ShowWindow hWnd_x, SW_SHOW



ShowWindow hWnd_x, WindState

SetFocusApp hWnd_x

'Exit Sub

SetWindowPos hWnd_x, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW Or SWP_NOSIZE Or SWP_NOMOVE
Sleep 50

If Win_TPM = 0 Then SetWindowPos hWnd_x, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE


'''

Sleep 100

If SW = 1 And lpPrevWndProc <= 0 And GetForegroundWindow = hWnd_x And GetActiveWindow = hWnd_x Then

GetCursorPos coord_old

 WindowGetCoord hWnd_x, coord_x, coord_y, 0, 0

coord_x = coord_x + 30
coord_y = coord_y + 15

 SetCursorPos coord_x, coord_y

'Sleep 50

 mouse_event MOUSEEVENTF_LEFTDOWN, coord_x, coord_y, 0, 0
 mouse_event MOUSEEVENTF_LEFTUP, coord_x, coord_y, 0, 0
'''Sleep 50
' mouse_event MOUSEEVENTF_LEFTDOWN, coord_x, coord_y, 0, 0
' mouse_event MOUSEEVENTF_LEFTUP, coord_x, coord_y, 0, 0
 SetCursorPos coord_old.x, coord_old.y

End If




End Sub
...
Рейтинг: 0 / 0
Стабильное переключение в другое приложение
    #39970977
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
здесь написали, что хак в Висте вырубили с помощью AttachThreadInput: http://bbs.vbstreets.ru/viewtopic.php?p=6712289#p6712289
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Стабильное переключение в другое приложение
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]