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

Отследить перехват фокуса приложения

03.02.2013, 17:32. Показов 3872. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Проблема такая: у меня на компьютере периодически кто-то перехватывает фокус секунды на 1-2, а потом обратно возвращает. Очень неудобно. Как мне это программно вычислить, т.е. узнать, что за программа? Грубо говоря, как отследить перехват фокуса в приложениях, открытых в Windows?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.02.2013, 17:32
Ответы с готовыми решениями:

Отследить потерю фокуса TextBox (VBA Excel)
Всем добрый вечер! Уважаемые форумчане - помогите советом. У меня в Excel есть форма, на форме различные контролы. Задача состоит в том,...

Перехват макроса запущенного офисного приложения
Открываем стандартно, к примеру, Любой.XLS Нужно, чтобы вместо него: - запустился свой макрос (например из личной книги), - он...

Перехват изменения фокуса в tabControl
при переключении мышкой между вкладками tabControl (т.е. при выборе той или иной tabPage) должно происходить наращивание или уменьшение...

15
Заблокирован
03.02.2013, 18:02
Saliery, Поставить антивирус. Просмотреть какие порты используются в данный момент. Поставить FireWall.
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
03.02.2013, 18:04
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Saliery Посмотреть сообщение
как отследить перехват фокуса в приложениях, открытых в Windows?
Visual Basic
1
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Функция возвращает дескриптор приоритетного окна.
Пишешь приложение, где в таймере записывается лог всех приложений, которые получали фокус. Таймер нужно использовать не Vb6, а системный.
Visual Basic
1
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
3
 Аватар для morgann55
1365 / 207 / 37
Регистрация: 09.02.2012
Сообщений: 745
03.02.2013, 19:22
Pro_grammer, А что в таймере прописать, можешь подсказать ?? ПЛЗ !!
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
03.02.2013, 19:51
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от morgann55 Посмотреть сообщение
А что в таймере прописать
В модуле
Visual Basic
1
2
3
4
5
6
7
Declare Function GetForegroundWindow Lib "user32" () As Long
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
 Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Sub TimerProc()
Ret = GetForegroundWindow()
Form1.Caption = Str(Ret)
End Sub
В форме
Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Form_Load()
'Create an API-timer
    SetTimer Me.hwnd, 0, 10, AddressOf TimerProc
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'Kill our API-timer
    KillTimer Me.hwnd, 0
    
End Sub
В заголовке окна будут сменятся цифры - дескрипторы приоритетного окна
3
6644 / 1511 / 169
Регистрация: 09.01.2010
Сообщений: 4,298
03.02.2013, 21:09
вариант (можно еще добавить/заменить) запись в файл
модуль
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
Option Explicit
Private Declare Function GetForegroundWindow Lib "user32" () As Long
 
      Declare Function SetTimer Lib "user32" _
            (ByVal hwnd As Long, _
            ByVal nIDEvent As Long, _
            ByVal uElapse As Long, _
            ByVal lpTimerFunc As Long) As Long
 
      Declare Function KillTimer Lib "user32" _
            (ByVal hwnd As Long, _
            ByVal nIDEvent As Long) As Long
 
      Global iCounter As Integer
Public hwnd_i As Long
 
      Sub TimerProc(ByVal hwnd As Long, _
                     ByVal uMsg As Long, _
                     ByVal idEvent As Long, _
                     ByVal dwTime As Long)
 
          iCounter = iCounter + 1
          If hwnd_i <> GetForegroundWindow Then
              hwnd_i = GetForegroundWindow
              If hwnd_i <> 0 Then
              Form1.List1.AddItem hwnd_i
          End If
          End If
      End Sub
форма (закрыв при таймер стоп
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
 Option Explicit
      Dim lngTimerID As Long
      Dim BlnTimer As Boolean
 
      Private Sub Form_Load()
         BlnTimer = False
         Command1.Caption = "Start Timer"
      End Sub
 
      Private Sub Command1_Click()
      'Starts and stops the timer.
 
         If BlnTimer = False Then
         hwnd_i = 0
            lngTimerID = SetTimer(0, 0, 200, AddressOf TimerProc)
            If lngTimerID = 0 Then
              MsgBox "Timer not created. Ending Program"
              Exit Sub
            End If
            BlnTimer = True
            Command1.Caption = "Stop Timer"
         Else
            lngTimerID = KillTimer(0, lngTimerID)
            If lngTimerID = 0 Then
               MsgBox "couldn't kill the timer"
            End If
            BlnTimer = False
            Command1.Caption = "Start Timer"
          End If
 
      End Sub
 
Private Sub Form_Unload(Cancel As Integer)
If BlnTimer = True Then Cancel = 1
End Sub
Добавлено через 51 минуту
если заменить модуль, то получим и название окна (если оно есть)
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
Option Explicit
Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
 
Private Declare Function GetForegroundWindow Lib "user32" () As Long
 
      Declare Function SetTimer Lib "user32" _
            (ByVal hwnd As Long, _
            ByVal nIDEvent As Long, _
            ByVal uElapse As Long, _
            ByVal lpTimerFunc As Long) As Long
 
      Declare Function KillTimer Lib "user32" _
            (ByVal hwnd As Long, _
            ByVal nIDEvent As Long) As Long
 
      Global iCounter As Integer
Public hwnd_i As Long
Dim titlebar As String
Dim slength As Long
 
      Sub TimerProc(ByVal hwnd As Long, _
                     ByVal uMsg As Long, _
                     ByVal idEvent As Long, _
                     ByVal dwTime As Long)
 
          iCounter = iCounter + 1
          If hwnd_i <> GetForegroundWindow Then
              hwnd_i = GetForegroundWindow
              If hwnd_i <> 0 Then
 
 
 
titlebar = String(256, " ")
slength = GetWindowText(hwnd_i, titlebar, 255)
titlebar = Left(titlebar, InStr(titlebar, vbNullChar) - 1)
 
              Form1.List1.AddItem hwnd_i & vbTab & vbTab & titlebar
          End If
          End If
      End Sub
1
 Аватар для morgann55
1365 / 207 / 37
Регистрация: 09.02.2012
Сообщений: 745
03.02.2013, 21:33
А если это "шпион" какой-то мудрит без окна, то ничего не получим ??
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
03.02.2013, 21:36
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от gaw Посмотреть сообщение
то получим и название окна
Лучше не название окна, а сразу имя файла. По имени его легко найти на диске, да и имя всегда есть в отличии от заголовка формы. Дополнил код, теперь на форму пишутся все имена файлов, которые в фокусе.

В модуле
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
Declare Function GetForegroundWindow Lib "user32" () As Long
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Declare Function Module32First Lib "kernel32" (ByVal hSnapshot As Long, uProcess As MODULEENTRY32) As Long
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
 
Private Type MODULEENTRY32
  dwSize As Long
  th32ModuleID As Long
  th32ProcessID As Long
  GlblcntUsage As Long
  ProccntUsage As Long
  modBaseAddr As Long
  modBaseSize As Long
  hModule As Long
  szModule As String * 256
  szExePath As String * 260
End Type
Sub TimerProc()
Dim uProcess As MODULEENTRY32
Static OldName$
Ret = GetForegroundWindow()
GetWindowThreadProcessId Ret, pid
 
hSnapshot = CreateToolhelp32Snapshot(8, pid)
uProcess.dwSize = Len(uProcess)
n = Module32First(hSnapshot, uProcess)
Name$ = Left(uProcess.szModule, InStr(uProcess.szModule, Chr(0)) - 1)
If Name$ <> OldName$ Then
 Form1.Print Name$
 OldName$ = Name$
End If
End Sub
Код формы почти без изменений

Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Form_Load()
Form1.AutoRedraw = True
'Create an API-timer
    SetTimer Me.hwnd, 0, 100, AddressOf TimerProc
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'Kill our API-timer
    KillTimer Me.hwnd, 0
    
End Sub
4
6644 / 1511 / 169
Регистрация: 09.01.2010
Сообщений: 4,298
03.02.2013, 21:36
можно процессы смотреть
0
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
03.02.2013, 22:13  [ТС]
Всем огромное спасибо!!!!!!!!!!
0
 Аватар для morgann55
1365 / 207 / 37
Регистрация: 09.02.2012
Сообщений: 745
03.02.2013, 22:50
Pro_grammer, Спасибо за последнюю версию !! Добавил в модуль (для удобства копирования):
Visual Basic
1
Form1.Text1.Text = Form1.Text1.Text & Name$ & vbNewLine
Теперь половим
1
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
04.02.2013, 12:23
Может быть получится узнать какая зараза периодически включает сканер и сканирует.
1
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
06.02.2013, 04:23  [ТС]
Alex77755, получилось, это LiveUpdate.exe от МТС Коннект Менеджера

Добавлено через 9 секунд
Спасибо всем!
0
14 / 15 / 1
Регистрация: 17.02.2014
Сообщений: 40
18.04.2019, 14:34
Здравствуйте! Помогите и простите за совсем глупый вопрос, туплю что-то вообще... Куда прописывать (скопировать) нужно данный код?
С "Private Sub Form_Load()..." понятно, в данный раздел. А что такое модуль? Это где? В обозревателе решений добавлял модуль с стандартным именем "Module1.vb" (это правильно?), копировал в него тот код который в постах стоит под заголовком "в модуле". Так же пытался скопировать его и выше "Private Sub Form_Load(), и выше "Public Class Form1" и ниже их, везде один результат, практически весь код подчёркивается красным и куча ошибок, соответственно не компилируется... Ошибок много и все разные, при необходимости скрины сделаю.
Стоит Microsoft Visual Studio 2015. Frame Work 4.7
Заранее благодарен за разъяснение...
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
18.04.2019, 18:12
Цитата Сообщение от oleg_v Посмотреть сообщение
Стоит Microsoft Visual Studio 2015. Frame Work 4.7
Вот в этом одна большая ошибка. Код написан исключительно для VB6.
Платформа .NET на нашем форуме в другом разделе, там поспрашивайте как сделать или конвертировать этот код.
1
14 / 15 / 1
Регистрация: 17.02.2014
Сообщений: 40
19.04.2019, 06:54
Да действительно, на название форума обратить внимание как-то не получилось сразу, нельзя по вечерам работать уставшим... Поставил VB6.0 и всё заработало с первого раза... Большое спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.04.2019, 06:54
Помогаю со студенческими работами здесь

Выполнение в фоновом потоке - перехват фокуса элементов управления
День добрый Я разрабатываю приложение, которое управляет другим, &quot;большим&quot; приложением через com interop. На одном из этапов программы,...

??? - получение фокуса приложения
Господа! Вопрос таков. Например, как по нажатию кнопки, приложение 'A' (уже открытое) вылезало на передний план. Должно быть что-то вроде...

Активация сторонего приложения и передача фокуса
Здравствуйте. Имеется окно программы под названием &quot;Player&quot;. Как его активировать(поднять на передний план) и передать фокус?...

Как назначить иконку для приложения без фокуса вообще
Всем привет, подскажите пожалуйста, как назначить иконку для приложения, у которого вообще нет никакого окна? Т.е. грубо говоря набор...

Как убрать при запуске приложения рамку фокуса на элементе
Как убрать вот такое вот чудо при запуске программы ( на кнопке пуск - старт ) видно точечные окончания или как правильно это назвать?!...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru