-
Значит так, задача тривиальна и обсуждалась уже миллион раз: Понажимать кнопочки \ прочитать эдиты в чужой программе. Но, при всей своей простоте не может быть мной реализована по причине невозможности определить хэндлы интересующих контролов. Конкретнее: Имеется основное окно программы, хэндл которого ищется без проблем но только по заголовку окна. Его клас по spy++ - "#32770 (Dialog)". Если искать по классу ничего не находит. Это окно порождает другое окно такого же класса, которое так же до недавнего времени находилось по заголовку. Но вдруг буквально час назад перестало находиться. Причем отчего и почему я никак не могу понять.В коде вроде ничего не менял, проверял его 100500 раз. Но вероятность моей ошибки естественно не исключаю. Далее, на этом окне имеется панель, которая также имеет класс "#32770 (Dialog)" и не имеет заголовка.Так вот к этой панели я совершенно не могу подобраться опять же потому что FindWindowEx не видит контролов по этому классу. Начитавшись различных форумов пришел к выводу что причина этого безобразия кроется в плохой работе FindWindowEx на Windows XP. Думаю завтра начать с переустановки "винды", дабы исключить возможность помех работы WinApi различными программами. Так же планирую поставить свежескачанный Delphi 2010 вместо 7. Понимаю, что на работу апи это не повлияет, но чем черт не шутит. Только что прочитал в msdn что вместо класса в функцию можно вставлять атом класса. Завтра нужно будет попробовать. Да и еще нашел функцию getdlgitem, которую можно использовать для нахождения хэндла панели по ИД, но так как уже не находит и дочернее окно, то её тестирование также откладывается на потом. Итак, хотелось бы услышать мнение специалистов о причинах данной проблемы и\или возможные решения без использования FindWindowEx.
Заранее спасибо и с праздником!
-
> imprezident (05.04.10 01:18)
> Его клас по spy++ - "#32770 (Dialog)".
Его класс, видимо, "#32770", а Dialog - это расшифровка by spy.
> причина этого безобразия кроется в плохой работе FindWindowEx
Причина в в ошибке, в 17 строке.
-- Regards, LVT.
-
класс диалогового окна это MakeIntResource(32770)
-
как всегда виновата винда,дельфя,что угодно-кроме я...
-
> Игорь Шевченко © (06.04.10 12:08) [2]
> класс диалогового окна это MakeIntResource(32770)
Class Description #32768 The class for a menu. #32769 The class for the desktop window. #32770 The class for a dialog box. http://msdn.microsoft.com/en-us/library/ms633574(VS.85).aspx -- Regards, LVT.
-
Leonid Troyanovsky © (06.04.10 12:22) [4]
winuser.h
/* * Dialog window class */ #define WC_DIALOG (MAKEINTATOM(0x8002))
-
> Игорь Шевченко © (06.04.10 13:50) [5]
> #define WC_DIALOG (MAKEINTATOM(0x8002))
Windows.WC_DIALOG = MakeIntAtom($8002);
Я про то, что имя атома пользовать не возбраняется, т.е., FindWindow('#32770', nil) прекрасно ищет диалоги.
-- Regards, LVT.
-
Leonid Troyanovsky © (06.04.10 14:17) [6]
Я даже знаю, почему. Потому что значок # говорит, что оставшуюся часть строки надо в атом преобразовать.
-
to QAZ Об этом мне подсказали различные "мастера" на форумах. До этого честно бился 3 часа в полной уверенности что ошибка в моих знаниях ;)
-
> в полной уверенности что ошибка в моих знаниях ;)
И ты еще до сих пор сомневаешься?
-
Нет, уже нет)), проблема решилась, всем спасибо.
-
Здравствуйте столкнулся с похожей проблемой. Главное окно "Windows" - дочернее окно #32770 "" - Button "Buy". Нужно добраться до кнопки "Buy" и нажать. h:=FindWindowEx(FindWindow('Windows', nil),FindWindow('#32770', nil),'Button','Buy');
PostMessage(h, BM_CLICK, 0, 0); НЕ работает Через winspy++ видно много неактивных акон класса #32770 "" как выбрать первое, единственно активное?
-
(саркастично) FindWindowEx плохая, негодная функция.
-
Первое активное - это уже не через поиск, это функция есть для возвращения хэндла окна с текущим фокусом
|