|
Приложение не хочет получать фокус, а вместо этого мигает. | ☑ | ||
---|---|---|---|---|
0
DJ Anthon
26.03.16
✎
07:58
|
Написал приложение на древнем языке Delphi, на всех компах работает нормально, но на одном компе через полгода нормальной работы перестало перехватывать фокус окна.
Программа управляет китайским плеером видеонаблюдения. При активизации окна этого плеера фокус ввода должен перехватываться моей программой. Что могло произойти в винде такого? |
|||
1
DJ Anthon
26.03.16
✎
08:01
|
Примечательно, что под другим пользователем работает, по рдп тоже. Но под тем пользователем установлена куча программ, его неохота переустанавливать.
|
|||
2
Записьдампа
26.03.16
✎
08:10
|
Очевидно же, что в куче программ, которые неохота переустанавливать, существует одна или несколько, которые другого мнения о фокусе ввода.
Или пользователь включил какую-либо настройку для инвалидов, которая заставляет фокус следовать за мышью. |
|||
3
DJ Anthon
26.03.16
✎
08:17
|
(2) да что-то фокус за мышью не следует.. и если они другого мнения о фокусе ввода, как они себя ведут? запрещают его перехват другим программам? там даже антивиря нет...
|
|||
4
Записьдампа
26.03.16
✎
08:23
|
(3) Вот уж понятия не имею. Что-то как-то делают при наступлении каких-то условий. Ты ж вот чем-то руководствовался, когда свое поделие писал? Вот и авторы других программ так же...
|
|||
5
DJ Anthon
26.03.16
✎
08:24
|
да нет там никаких программ. мне кажется, это в винде что-то сломалось.
|
|||
6
Записьдампа
26.03.16
✎
08:31
|
(5) Ты нам наврал в (1) ?
|
|||
7
Криэйтор
26.03.16
✎
08:53
|
Защита от перехвата фокуса, проверь https://technet.microsoft.com/en-us/library/cc957208.aspx и ForegroundFlashCount.
|
|||
8
Записьдампа
26.03.16
✎
08:58
|
(7) Запросто. Как результат использования Powertoys, например.
|
|||
9
DJ Anthon
26.03.16
✎
09:21
|
(6) они же давно установлены, а программа перестала работать сейчас
|
|||
10
Записьдампа
26.03.16
✎
09:32
|
(9) Обычно, у программ есть настройки.
|
|||
11
DJ Anthon
26.03.16
✎
09:42
|
(7) интересная вещь. но у меня этот параметр по дефолту, тем не менее, программа спокойно перехватывает фокус. тот комп выключили, поэтому посмотреть сейчас не могу, позже попробую еще поколупать. кстати, такая же фигня есть и у 1С 7.7, но если ее запустить с правами администратора, то фокус она перехватывает немного лучше. здесь же права администратора не помогают, потому что выключен UAC, то есть программа все равно запускается с правами пользователя. позже попробую включить UAC, может, дело в нем.
|
|||
12
Записьдампа
26.03.16
✎
09:54
|
Даже боюсь спросить, "немного лучше", это как? Чуть-чуть восторженней и преданно заглядывая в глаза?
|
|||
13
DJ Anthon
26.03.16
✎
09:58
|
(12) чаще. из сотни раз, когда она должна это сделать, раз 10 все равно не перехватывает.
|
|||
14
Записьдампа
26.03.16
✎
10:14
|
А. Ну, это в винде что-то сломалось, однозначно. Кривая методика перехвата тут совершенно не при чем.
|
|||
15
DJ Anthon
26.03.16
✎
10:33
|
кривая методика перехвата у 1С 7.7, так как она для 98-й винды еще написана, поддержка 7ки в ней никакущая. то есть изначально она на 7ке в отладчике нормально работать не будет. а у меня просто вызов функции
if GetForegroundWindow = RVi then SetForegroundWindow(Handle); что здесь кривого? тем более, что везде работает, кроме одного компа |
|||
16
Записьдампа
26.03.16
✎
10:38
|
Документацию читать, конечно Александр Сергеевич будет, как всегда...
The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true: 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 process is being debugged. The foreground process is not a Modern Application or the Start Screen. The foreground is not locked (see LockSetForegroundWindow). The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo). No menus are active. An application cannot force a window to the foreground while the user is working with another window. Instead, Windows flashes the taskbar button of the window to notify the user. A process that can set the foreground window can enable another process to set the foreground window by calling the AllowSetForegroundWindow function. The process specified by dwProcessId loses the ability to set the foreground window the next time the user generates input, unless the input is directed at that process, or the next time a process calls AllowSetForegroundWindow, unless that process is specified. The foreground process can disable calls to SetForegroundWindow by calling the LockSetForegroundWindow function. |
|||
17
DJ Anthon
26.03.16
✎
10:42
|
ясно, спасибо. то есть, какая-то софтинка поставила вызвала LockSetForegroundWindow?
|
|||
18
Записьдампа
26.03.16
✎
10:51
|
Ну там много вариантов. Пересмотри логику управления - отбирать ввод, это аццкий костыль.
|
|||
19
DJ Anthon
26.03.16
✎
11:33
|
(18) психанул, выехал на место, все работает. ничего не делал, только несколько раз ребутился.
а у меня другого выбора нет. этот долбаный плеер (а только он проигрывает эти файлы) не имеет клавиш управления. они все нарисованы. моя программа перехватывает фокус для того, чтобы "тыкнуть" мышкой в нужное место на экране. расположение кнопок вычисляю, кроме того, необходимо выгружать данные с этого плеера, которые доступны в текстовом виде, в эксель. их программа тоже перехватывает. и еще делает процесс подгрузки новых файлов непрерывным. в эксель данные закидываю с помощью COM, поэтому тормозов никаких нет. юзер вообще не видит, что что-то перехватывает фокус, просто теперь он работает с клавой, а не мышкой. какие другие варианты вы предлагаете? |
|||
20
Garykom
гуру
26.03.16
✎
12:35
|
(0) ЫЫЫ как знакомо сам такое делал годик назад для видеорегистратора конвертера китайского чтобы он из своего формата в нужный мне пережал.
Проблему решил задержками и заменой postmessage на sendmessage где нуна http://www.programmersforum.ru/showthread.php?t=59049 timeSleep := 1; if FormMain.CheckBoxOldComp.Checked then begin timeSleep := 100; end; Sleep(timeSleep); Result := True; try if ObjectHandle <> 0 then for i := 1 to length(aText) do begin sendmessage(ObjectHandle, WM_CHAR, Ord(aText[i]), 0); Application.ProcessMessages; Sleep(timeSleep); end; except Result := False; end; |
|||
21
Garykom
гуру
26.03.16
✎
12:38
|
(20)+ на Лазарусе делал, причем пришлось галочку делать специальную "Глючный комп" при которой все начинает по 2 раза проверять, по два раза делать (сначала откроет потом закроет окно и снова откроет) и задержки увеличены
https://www.dropbox.com/s/rpri04shnaefqyy/Скриншот%202016-03-26%2012.37.24.png?dl=0 |
|||
22
Garykom
гуру
26.03.16
✎
12:40
|
(21)+ конвертер файлы от нескольких камер в один многопотоковый MKV собирает с доп каналом (дополнительно отрендеренным) несколько камер на одном сплит экране
|
|||
23
Garykom
гуру
26.03.16
✎
12:45
|
(19) Решение только 1 надежное.
Вынести это на отдельный системник подальше от кривых ручек юзверей, все настроить чтобы работало, запретить обновления и не трогать больше! |
|||
24
DJ Anthon
31.03.16
✎
14:39
|
(23) ненене, это вам не организация. люди работают на дому на разных компах/ноутах/мониках и надо, чтобы все работало. тем более что моя прога защищена от их вмешательства, только у меня секретная кнопка, которая позволяет мне что-то менять, только вот я зря ее писал. все работает сразу после установки и не требует никаких изменений (редко удается написать что-то настолько удачное). но раз в полнолуние в пятницу, 13-е, когда на горе жареный петух три раза раком крестится после дождичка в четверг, происходит подобная херня, которая, как выяснилось, лечится ребутом.
|
|||
25
DJ Anthon
31.03.16
✎
14:49
|
(20) мне надо было данные передавать в эксель, никакие сендмессги и постмессаги не работали, хотя на блокноте все работало. ком тоже не с первой попытки заработал. никак не мог понять в чем дело, пару часов потерял впустую.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |