С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451

Стабильное переключение в другое приложение

11.06.2020, 21:40. Показов 1642. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, товарищи!
Подскажите, пожалуйста, как можно гарантированно переключиться в приложение?
Уже полдня просидел, так ничего не могу сообразить.

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

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

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

Visual Basic
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
Вложения
Тип файла: zip HWND_TOP.zip (5.5 Кб, 5 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.06.2020, 21:40
Ответы с готовыми решениями:

Как можно заблокировать переключение на другое приложение
Как можно заблокировать переключение на другое приложение с помощью alt-tab, alt-esc и т.д.?

Запрет на переключение на другое приложение
Пишу программу &quot;Тестер&quot;, для проведения электронных тестов. Но никак не могу сделать чтобы было запрещено сворачивать программу,...

Переключение на другое оформление
Как можно было бы сменить весь дизайн формы при клике по кнопке? Добавлено через 24 минуты Мол при клике на кнопку в форме, меняется...

10
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.06.2020, 22:16
Нужно дождаться пока процесс инициализируется. Как минимум нужно вызвать функцию WaitForInputIdle. Затем разрешить установку окна переднего плана AllowSetForegroundWindow. Потом сканировать все окна верхнего уровня процесса и установить первому окну SetForegroundWindow.
3
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
12.06.2020, 23:27  [ТС]
The trick, нашёл какой-то пример:


Visual Basic
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
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
14.06.2020, 00:06  [ТС]
Что-то сделал, вроде, стало лучше. Но у меня вопрос: если это моё приложение, оно будет стабильнее работать? Просто я разницы особо не заметил, своё (сам себя) или чужое раскрывать/скрывать.
Заметил особенность: после появление окна, оно серое (неактивное), пока не сделаешь клик там.
Я осуществил такое решение, но оно слишком безобразное. Нельзя ли как-то клик в приложении осуществить более цивилизованным образом?

Visual Basic
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
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
14.06.2020, 20:32
AttachThreadInput + SetActiveWindow. Вроде так.
2
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
14.06.2020, 21:39
Цитата Сообщение от Saliery Посмотреть сообщение
Что-то сделал, вроде, стало лучше. Но у меня вопрос: если это моё приложение, оно будет стабильнее работать? Просто я разницы особо не заметил, своё (сам себя) или чужое раскрывать/скрывать.
Я же скинул как нужно сделать. В чем проблема?

Цитата Сообщение от Dragokas Посмотреть сообщение
AttachThreadInput + SetActiveWindow
Active-окно и Foreground-окно разные вещи. Я так понял ему Foreground-окно нужно сделать. Если у него приложение "обламывается" при установке окна верхнего уровня, то скорее всего необходимо вызвать AllowSetForegroundWindow. У меня Shell сам по себе выводит как нужно, поэтому потестить не могу.
1
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
18.06.2020, 00:58  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Я же скинул как нужно сделать. В чем проблема?
спасибо огромное, только я не очень разбираюсь в этих всех делах
что-то смастерил, посмотрите, правильно ли я вас понял?

Visual Basic
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
Public Sub WindowSetState(ByVal hWnd_x As Long, ByVal WindState As WNDSTATE, Optional ByVal SW As SWS = 0)
 
 
Dim tek_hWnd As Long
Dim tek_hWnd1 As Long
 
 
 Dim lWindowState As Long
 Dim tWinPlace As WINDOWPLACEMENT
 
 
      Dim MyThreadID As Long
     Dim ActiveThreadID As Long
     Dim AttachThread As Long
 
If lpPrevWndProc <= 0 Then
 
MyThreadID = GetCurrentThreadId() ' Получение ID нашего потока
ActiveThreadID = GetWindowThreadProcessId(GetForegroundWindow, 0) ' Получение ID потока активного в данный момент окна
 
If MyThreadID <> 0 And ActiveThreadID <> 0 And MyThreadID <> ActiveThreadID Then
AttachThread = AttachThreadInput(MyThreadID, ActiveThreadID, 1)    ' Присоединяемся к потоку, окно которого в данный момент активно
AllowSetForegroundWindow ActiveThreadID
 
Sleep 200
 
End If
 
 
 
 End If
 
 
 
  tWinPlace.Length = Len(tWinPlace)
 Call GetWindowPlacement(hWnd_x, tWinPlace)
 
 
 
 
 
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
 
 
 
 
    tWinPlace.showCmd = WindState
    Call SetWindowPlacement(hWnd_x, tWinPlace)
 
 
 
 
 
If AttachThread <> 0 Then AttachThreadInput MyThreadID, ActiveThreadID, 0  ' Более не имеет смысла держаться за поток, чьё окно БЫЛО активным ;)
 
 
 
 
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
 
 
BringWindowToTop hWnd_x
OpenIcon hWnd_x
SetActiveWindow hWnd_x
SetForegroundWindow hWnd_x
 
 
ShowWindow hWnd_x, SW_RESTORE
ShowWindow hWnd_x, 10
 
ShowWindow hWnd_x, SW_SHOW
ShowWindow hWnd_x, WindState
 
 
 
 
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
 
 
SetFocusApp hWnd_x
 
 
 
If 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 + 5
coord_y = coord_y + 5
 
 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
 
 
 
 
End Sub
Добавлено через 3 минуты
Цитата Сообщение от The trick Посмотреть сообщение
Я так понял ему Foreground-окно нужно сделать. Если у него приложение "обламывается" при установке окна верхнего уровня
у меня каша мала происходит полная
во-первых, нет стабильности в том, чтобы окно вообще показалось на передний план
во-вторых, когда показывается, на нём нет фокуса (оно серого цвета)

просто если Shell вызывать по кнопке, то всё работает, конечно, ещё бы
а у меня задача-то другая: программа работает в фоновом режиме, у неё работает таймер с интервалом 1000 мс. и, если определённое условие в программе возникло, тут же должно появиться окно на переднем плане активное

Добавлено через 6 минут
а здесь написали, что хак в Висте вырубили с помощью AttachThreadInput: http://bbs.vbstreets.ru/viewto... 9#p6712289
0
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
19.06.2020, 15:57  [ТС]
Смастерил как-то, не знаю, мне кажется, лучше не будет. Тут надо разбираться в деталях, а я в них никак не разбираюсь.

Visual Basic
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
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.06.2020, 23:55
А что у тебя за приложение в роли кролика, какое-то классическое? На других пробовал? И что за ОС?
1
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
20.06.2020, 12:14  [ТС]
Dragokas, разные приложения: своё приложение (сам себя показываю, когда надо), AkelPad, своё другое приложение, особо не пробовал, если свои приложения не открывались и стандартный AkelPad. Windows 7 x64.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.04.2023, 16:17
Цитата Сообщение от Saliery Посмотреть сообщение
хак в Висте вырубили с помощью AttachThreadInput
в висте не проверял, но в семёрке у меня работает просто отлично. ещё могу сказать что этот способ не всегда активизирует окно, в windows 9x, и я думаю в некоторых других версиях винды, если фокус программы находится на DOS-окне то перехват не сработает уже, потом там есть ещё какие-то ограничения, если открыто активное контекстное меню, начиная с win2000 то тоже фокус может не переводиться

Добавлено через 1 минуту
Цитата Сообщение от Saliery Посмотреть сообщение
нашёл какой-то пример
Я этот код придумал ещё в 2005 году, у меня ещё Интернета тогда даже небыло кстати... Сам придумал код, копаясь в API вьювере... Вот:

Visual Basic
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
Option Explicit
Option Compare Text
'//////////////////////////////////////////////////
'// Модуль активизации своего окна               //
'// Copyright (c) 06.11.2005 by Владислав Пешков //
'// e-mail: vladpeshkov@yandex.ru                //
'// Версия 1.0                                   //
'//////////////////////////////////////////////////
 
' Декларации API...
Private Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
 
' Активизация своего окна
Public Sub ActivateForm(frm As Form)
    '********************************************************
    '* Внимание!!! Данная функция не применима,             *
    '* если текущее активное окно является DOS-приложением! *
    '********************************************************
    
    Dim pID As Long
    Dim destid As Long
    
    If GetForegroundWindow = frm.hwnd Then Exit Sub
    
    destid = GetWindowThreadProcessId(GetForegroundWindow, pID)
    AttachThreadInput GetCurrentThreadId, destid, True
    frm.SetFocus
    AttachThreadInput GetCurrentThreadId, destid, False
End Sub
Добавлено через 2 минуты
В десятке кстати тоже работает. Насчёт Висты я не проверял, но скорее всего трындёж
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.04.2023, 16:17
Помогаю со студенческими работами здесь

Скомпилировать приложение так, чтобы другое приложение было у него в ресурсах
Хочу написать программу-компилятор, в которой нужно указать файл, и она скомпилирует другую программу, с указанным в ней файлом в качестве...

Встраивание в приложение другое приложение классом QX11EmbedContainer
Здравствуйте, нужно сделать так, чтобы в основное приложение встроилось другое (которое я вызываю классом QProcess), самое смешное, что...

Запустить одно свое приложение через другое свое приложение
Здравствуйте. В программе &quot;программа1&quot; запускаю &quot;программа2&quot; через Process.Start(&quot;программа1&quot;); Возникает ошибка, говорит не...

Запущено ли другое приложение ?
Как программно узнать запущено ли приложение tratata.exe ? Может ссылочку кинете какю-нибудь.

Переход на другое приложение
Как сделать кнопку , чтобы при нажатии которой происходил переход в activity другого андроид приложения - В net.xxx.yy/net.xxx.yy.Activity1


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru