Форум: "WinAPI";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
ВнизHandle поля ввода чужого приложения Найти похожие ветки
← →
Nostradamus (2006-01-29 18:19) [0]Имеется следующая проблема: нужен хэндл поля ввода чужого приложения, причем именно того контрола который последний имел фокус перед тем как юзер переключился на мою программу. Это должно работать с любой чужой прогой и любым контролом ввода текста т.е. Edit, Memo, Rich Edit, ComboBox и т.д.
Пробовал ставить хук на EN_KILLFOCUS и на WM_COMMAND - что-то ловилось, но толко не то что нужно :( Пробовал ставит следуюшие хуки: WH_CALLWNDPROCRET, WH_CALLWNDPROC, WH_GETMESSAGE, WH_MSGFILTER, WH_SYSMSGFILTER. Что характерно с WM_COMMAND оно таки работало, но только с котролами моей программы...
Такое ощущение, что я близок к правилному решению, но я к сожалению не могу доперет, что нужно изменить :(
Плюс когда я так делаю я не знаю как определить тип контрола хэндл которого я получаю
.
Заранее благодарен.
Вот как я делал:
function ShellHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT; stdcall;
var
pMsg : PHookMsg;
begin
pMsg := Pointer(ParamL);
if (pMsg^.Msg = WM_COMMAND) then
SendMessage(Data^.AppWnd, WM_USER, ParamW, pMsg^.LPARAM);
Result := CallNextHookEx(Data^.OldHook, Code, ParamW, ParamL)
end;
function SetShellHook(Wnd: HWND): BOOL; stdcall;
begin
if Data <> nil then
begin
Data^.AppWnd := Wnd;
Data^.OldHook := SetWindowsHookEx(WH_CALLWNDPROCRET, @ShellHook, HInstance, 0);
Result := Data^.OldHook <> 0
end
else Result := False
end;
← →
Nostradamus (2006-01-30 13:11) [1]Блин, не ужели нет ни у кого никаких идей?
После долгих проб и ошибок решил сделать по-другому:
Поставил хук WH_SHELL и ловлю им когда активируется чужое окно, там уже можно с помощью FindWindowEx или EnumChildWindows найти нужный мне контрол. Только теперь проблема определить
1. Поле ввода найденый котрол или нет и
2. Иммет ли он сейчас фокус
Думаю насчет фокуса должно получитсиа если буду хуком ловить WM_SETFOCUS,
а вот как определить действително ли контрол для ввода текса - ума не приложу.
Подскажите пожалуйста как решить эту проблему.
Буду рад если меня пошлют в MSDN :)
P.S. Может я не понятно объяснил задачу?
← →
kaZaNoVa © (2006-01-30 13:14) [2]
> 1. Поле ввода найденый котрол или нет и
может тип какой-нить глянуть?
← →
Nostradamus (2006-01-30 13:20) [3]В том то и дело, что не понятно куда глядеть :(
Можно получить имя класса (GetClassName), но оно ничего не даст :(
← →
Игорь Шевченко © (2006-01-30 13:29) [4]AttachThreadInput + GetFocus не поможет ?
← →
Nostradamus (2006-01-30 13:40) [5]К сожалению не могу сейчас попробовать, но звучит не плохо.
Спасибо. Как сделаю - отпишусь получилось или нет.
← →
Nostradamus (2006-01-30 13:44) [6]Остаётся вопрос как определить тип контрола?
← →
Игорь Шевченко © (2006-01-30 13:50) [7]
> как определить тип контрола?
GetClassName.
А если не секрет, в связи с чем такая задача возникла ?
← →
Nostradamus (2006-02-01 12:37) [8]Огромное спасибо!!! AttachProcessInput оказалось именно то, что нужно.
Определять тип контрола мне уже не нужно - я придумал как без этого обойтись.
> А если не секрет, в связи с чем такая задача возникла ?
Делаю программу которая должна ускорять ввод часто повторяющихся кусков текста, т.е. как скажем в Ворде автозамена и шаблоны, только должно работать везде где можно вводить текст.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.043 c