Как получить хэндл активного окна и активного контрола в нем

плиз помогите 31.05.2004 - 11:05 | Как получить хэндл активного окна и активного контрола в нем из чужой программы с помщью АПИ?
плиз помогите 1 - 31.05.2004 - 14:00 | Ну и жадные Вы. Половину сам уже нашел - GetForeGruondWindow. А вот с контролом что-то не получается. Мне нужен хэндл edit box-а, а на форме edit box и две кнопки. Несмотря на то, что курсор стоит в edit box-е выдается хэндл одной из кнопок? Пробовал - getwindow, gettopmostwindow. Может таки кто подскажет?
Delphist 2 - 31.05.2004 - 14:37 | EnumWindows EnumChldsWindows . Интересно, разница между постами всего 3 часа. Почему у многих людей складывается впечатление, что в онлайне сидят армии незанятых программистов? . Автору вопроса: уважение к посетителям форума - залог ответа на вопрос. Вы же не спрашиваете на улице: Эй, козлы, который час?
плиз помогите 3 - 31.05.2004 - 18:01 | Вообще-то это вроде как шутка была. Но все равно извините.
плиз помогите 4 - 31.05.2004 - 18:02 | Шутка в смысле насчет жадности, а не на счет сабжа.
плиз помогите 5 - 31.05.2004 - 18:05 | С помощью Enum... - это перебором. А без перебора никак нельзя?
Delphist 6 - 01.06.2004 - 03:50 | Да я не обиделся, просто удивился. Без перебора - FindWindowEx, хотя таким методам я никогда не доверял. Тем более, перебор занимает мало времени, а гарантии 100%.
плиз помогите 7 - 01.06.2004 - 12:34 | Я все таки не понял. С помощью функции GetForeGroundWindow я получаю хэндл активного в настоящий момент окна. Допустим потом я с помощью Enum определяю какие контролы есть в этом окне (child windows), а как узнать что именно в этом контроле сейчас стоит курсор от клавиатуры?
Delphist 8 - 01.06.2004 - 14:01 | GetFocus А MSDN есть? Могу рекомендовать понемногу разбирать главу за главой, например неделя на главу. И мозги не запарятся, и появится серьезное понимание архитектуры Windows и принципов ее деятельности. Говорю серьезно, без подколов и приколов.
techwriter 9 - 01.06.2004 - 15:11 | MSDN: The GetFocus function retrieves the handle of the window that has the keyboard focus, if the window is associated with the calling thread's message queue. If the calling thread's message queue does not have an associated window with the keyboard focus, the return value is NULL. А у тебя как раз этот случай. Через EnumChildWindows примерно так, в EnumChildProc: - получаешь handle и проверяешь editcontrol -? - если едит шлеш ему EM_GETSEL, если есть выделение значит - это ОНО. А еще есть возможность через AttachThreadInput приатачиться к родительскому окну, которому принадлежит твой edit control, и тогда сможешь обойти указанное выше ограничение. Но там тоже есть свои заморочки, так что копай сам. Удачи.
Delphist 10 - 01.06.2004 - 21:21 | Да, про чужую программу я уже забыл. Но это тоже не беда. Применяем технику Hook DLL Injection на конкретный поток. Но чтобы узнать номер этого потока, нужен либо опять таки перебор, либо GetWindowThreadProcessId(HWND). Hook DLL Injection есть у Рихтера, да и в Сети валом статей на эту же тему.
archimag 11 - 02.06.2004 - 21:05 | Hook Dll - это лишнее, проще всего так: // получаем хандл активного окна верхнего уровня HWND topwnd = GetForegroundWindow(); // получаем id чужого потока DWORD other_thread = GetWindowThreadProcessId( topwnd, NULL ); // получаем id своего потока DWORD current_thread = GetCurrentThreadID(); // подсоединяемся к чужому потоку AttachThreadInput( current_thread, other_thread, TRUE); //Момент истины HWND focuswnd = GetFocus() // отсоединяемся AttachThreadInput( current_thread, other_thread, FALSE);
Delphist 12 - 02.06.2004 - 22:24 | Слушай, а при AttachThreadInput поток что, переходит в адресное пространство другого процесса? Или там появляется какой stub proxy? Интересный момент, как-то не задумывался об этом раньше.
archimag 13 - 03.06.2004 - 02:16 | Нет, всё проще. Для каждого потока, подключённого к потоку ввода, система поддерживает информацию о состоянии ввода, в том числе и о фокусе. Это информация уникальна для каждого потока. Поэтому Функция GetFocus не работает с другими потоками. Функция AttachThreadInput заставляет два потока использовать одну и ту же информация о состоянии ввода. Более подробно сейчас не скажу. У Рихтера есть глава, посвящённая потокам ввода.
плиз помогите 14 - 07.06.2004 - 15:35 | AttachThreadInput объединяет очередь сообщений для двух процессов. И поэтому чужой процесс может получить информацию о состоянии ввода, активном окне, фокусе и т.д. Но тоже не все гладко - The AttachThreadInput function also fails if a journal record hook is installed. Journal record hooks attach all input queues together. В общем я уже сам допер, спасибо TechWriter-у и сделал через AttachThreadInput. Все работает,единственно с Word-ом не получается. Хэндл окна определяется правильно, шлю сообщение WM_CLEAR, а он, ворд, не реагирует padla. Но уто уже другая песня. Разберусь немного чтобы хоть суметь вопрос сформулировать. Всем откликнувшимся спасибо. А вообще это не такая уж и тривиальная задача. Я пробовал еще так GetForegroundWindow GetWindowThreadProcessId Но потом по идентификатору возвращаемому функцией GetWindowThreadProcessId получить хэндл так и смог получить. В MSDN пишут, что MS это не приветствует в целях защиты. Может кто знает как?
archimag 15 - 07.06.2004 - 18:46 | "объединяет очередь сообщений" - это пожалуй немного не так, в MSDN говорится о "input mechanism", а это немного разные вещи. Office - это вообще отдельная история. Где-то полгода назад я запустил Spy++ и посмотрел на устройства Word-а. Чем больше смотрел, тем больше удивлялся. У меня содалось впечатление, что Microsoft при написании Office использовала какую-ту кросс-платформенную библиотеку, с минимальной зависимостью от Win32 API. Поэтому сделать что-то осмысленное с Word может оказаться проблематично. Насколько я знаю, получить хэндл потока через индефикатор нельзя. Отладчики и прочие "вредные" программы сохранют хэндлы потоков при их рождении. А если кто знает такой способ, пожалуйста сообщите, жизнь намного упроститься.

>>