|
Как ТОЧНО и БЕЗОШИБОЧНО узнать hwndTarget целевого окна?
|
|||
---|---|---|---|
#18+
Сразу определимся что нескольких экземпляров такого окна быть не может (страхуется при запуске EXE). Простой метод такой: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
В принципе это работает. Но это не надежно 1) Я могу создать папку с именем "My proga name", запустить совершенно другой EXE с таким же именем и т.д. 2) Даже если нет условий п.(1), то... я на Висте столкнулся с проблемой. Вдруг перестала находить окно. Debug показал что hwndTarget=65728 Оч.странное число, гуглил, ведет куда-то в SystemTray_Main, но точно не в мое окно. Метод которым надо действовать я в принципе понял (даже Ципиховичу или BeloZero -не помню кому именно, его когда-то советовал). Делаем перебор окон: Код: 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.
Но: в том виде как я этот код написал этот код делает то же самое (сравнивает If Title = "My proga name", возвращает app_hwnd и выходит) и будет также ошибаться, как и предыдущий. Т.е. вопрос. На что заменить код Код: vbnet 1.
Я знаю app_hwnd окна, я хочу знать что ЭТО ИМЕННО НУЖНОЕ ОКНО Каким свойством (кроме Title) снабдить окно (целевой EXE тоже мой) и как это свойство запросить из другого EXE зная app_hwnd ? Я пробовал GetWindowModuleFileName, но "буков много" и кажется это неэффективно. Можно еще поиграться с ByVal strClassName As String в FindWindow (первый метод), но это вряд ли сработает против EXE-муляжа с таким же именем. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2013, 16:28 |
|
Как ТОЧНО и БЕЗОШИБОЧНО узнать hwndTarget целевого окна?
|
|||
---|---|---|---|
#18+
Как вариант... Добавить в целевое окно кнопку, сделать ей: Код: vbnet 1. 2.
И искать перебором типа Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Это работает. Сойдет? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2013, 17:48 |
|
Как ТОЧНО и БЕЗОШИБОЧНО узнать hwndTarget целевого окна?
|
|||
---|---|---|---|
#18+
Любой вариант сойдет, если он делает то, что нужно, и ничего более. Еще можно слать окну свое сообщение, если ответ есть, значит оно. Минус — нужно сабклассить окно и отвечать на сообщение. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2013, 20:55 |
|
Как ТОЧНО и БЕЗОШИБОЧНО узнать hwndTarget целевого окна?
|
|||
---|---|---|---|
#18+
AntonariyЕще можно слать окну свое сообщение, если ответ есть, значит оно. Минус — нужно сабклассить окно и отвечать на сообщение. Собственно я это итак делаю: Вот текущий (продакшн) код на стороне клиента: Код: 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.
А проблема в том что на Висте уж не знаю при каких комбинациях запусков окон может случиться что этот код вместо реального hwndTarget возвращает hwndTarget=65728, что не соответствует реальному окну. Соответственно никакого сообщения назад не приходит и Form1.TextDocumentName.Text пустой. Да и следующую команду не пошлешь, hwndTarget то неправильный. AntonariyЛюбой вариант сойдет, если он делает то, что нужно, и ничего более. Вот я и спрашиваю. Код в моем предыдущем посте будет делать то что нужно и не более? Т.е. 1) Он перебирает все окна 2) Он проверяет окно на соответствие WINDOWTITLE_SERVER 3) Он дополнительно проверяет окно на наличие CHILD с хитрым Caption = "qwertyuiopasdfg" (например) 4) Если окно найдено, то вернет его hwnd и прекратит перебор, если нет -переберет окна и вернет 0. Просто проверка только WINDOWTITLE_SERVER не гарантирует от клона с таким же Caption, и более того (а подозрение что нечто такое и вызывает глюк), я не уверен что при создании иконки в трее (для искомого окна) система не генерит окно с таким же именем WINDOWTITLE_SERVER (SystemTray_Main ???), которое и будет с какой-то вероятностью найдено вместо искомого. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2013, 21:36 |
|
Как ТОЧНО и БЕЗОШИБОЧНО узнать hwndTarget целевого окна?
|
|||
---|---|---|---|
#18+
Дмитрий77А проблема в том что на Висте уж не знаю при каких комбинациях запусков окон может случиться что этот код вместо реального hwndTarget возвращает hwndTarget=65728, что не соответствует реальному окну.Проблема в том, что ты отправляешь не свое сообщение, а системное. Нет никаких гарантий, что системе не вздумается обработать его после тебя и переписать параметры. Свое сообщение это WM_USER + произвольное число. Значения больше WM_USER система гарантированно игнорирует. Дмитрий77Вот я и спрашиваю. Код в моем предыдущем посте будет делать то что нужно и не более? Это покажет лишь тестирование. Дмитрий771) Он перебирает все окна 2) Он проверяет окно на соответствие WINDOWTITLE_SERVER 3) Он дополнительно проверяет окно на наличие CHILD с хитрым Caption = "qwertyuiopasdfg" (например) 4) Если окно найдено, то вернет его hwnd и прекратит перебор, если нет -переберет окна и вернет 0.Чем больше условий тем больше вероятность не срабатывания алгоритма. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 09:51 |
|
Как ТОЧНО и БЕЗОШИБОЧНО узнать hwndTarget целевого окна?
|
|||
---|---|---|---|
#18+
Как-то искал окна с пустым Caption (их было несколько, не только нужные), выкрутился используя GetModuleFileNameEx ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 09:57 |
|
Как ТОЧНО и БЕЗОШИБОЧНО узнать hwndTarget целевого окна?
|
|||
---|---|---|---|
#18+
А ведь верно. У меня даже была функция FileByHwnd, но я ей не пользовался, и найти сейчас не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 10:14 |
|
Как ТОЧНО и БЕЗОШИБОЧНО узнать hwndTarget целевого окна?
|
|||
---|---|---|---|
#18+
_Дмит_GetModuleFileNameEx Не совсем понимаю причем тут именно эта ф-ция. Я смотрел в сторону GetWindowModuleFileName (работает аналогично GetWindowText). Но она по ходу возвращает полные пути и не к exe а к vbm60 чего-то там.dll (и это не в IDE) Мне это не понравилось. Но думаю с перебором и перепроверкой по child я тоже неплохо выкрутился - пока этот свой вариант и внедрил, замечу проблемы -буду думать дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 00:08 |
|
|
start [/forum/topic.php?fid=60&fpage=57&tid=2156943]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 157ms |
0 / 0 |