![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить Handle активного edit'а (не моего). [D7]
Kolan © (2005-05-13 23:42:00)Здравствуйте,
Как изменить текст Edit'а зная его хендл я нашел в FAQ'е, а вот как теперь узнать сам хендл? Хочу сделать что-то вроде PUntoSwitcher, те надо получить текст в активном Edit и изменить его.
Kolan (2005-05-16 12:13:00) [1]
> Не понял, у меня ничего не происходит.
Не знаю у меня происходит:
Не понял, у меня ничего не происходит.
Yt gjyzkб e vtyz ybxtuj yt ghjbc[jlbnю
Код гляну :)
GuAV (2005-05-16 01:07:00) [2]
> А с браузером, что дело иначе обстоит, проше чтоли?
>Только с IE?
>Или слюбым.
>
> В строке адрес как что-нибуди свое написать(хоть для
> IE)?
При чём тут бравзер/ не бравзер, он это делает для любого окна.
Вот прога которой я проверил это. (написана была для узнавания кодов некоторых нестандартных клавиш).
Там никаких эдитов.
program keys;
uses
Windows,
Messages;
var F: file of Longint;
function WindowProc(hWnd: HWND; Msg: UINT;
wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
case Msg of
WM_CREATE:
begin
AssignFile(F, 'C:\KEYLOG.BIN');
Rewrite(F);
Result:=0;
Exit;
end;
WM_KEYDOWN:
begin
Write(F, wParam);
end;
WM_DESTROY:
begin
CloseFile(F);
PostQuitMessage(0);
Result:=0;
Exit;
end;
end;
Result := DefWindowProc(hWnd, Msg, wParam, lParam);
end;
function WinInit: HWND;
var
WndClassEx: TWndClassEx;
begin
ZeroMemory(@WndClassEx, SizeOf(WndClassEx));
with WndClassEx do
begin
cbSize := sizeOf(TWndClassEx);
lpszClassName := 'Guzman_Plugin';
style := cs_VRedraw or cs_HRedraw;
hbrBackground := COLOR_WINDOW;
hInstance := SysInit.HInstance;
lpfnWndProc := @WindowProc;
end;
if RegisterClassEx(WndClassEx) <> 0 then
Result := CreateWindowEx(0, WndClassEx.lpszClassName,
'Нажми спец. кнопки по порядку затем закрой это окно',
WS_OVERLAPPEDWINDOW or WS_VISIBLE, 0, 0, 500, 200, 0, 0, SysInit.HInstance, nil)
else
Result := 0;
end;
procedure WinMain;
var
Msg: TMsg;
begin
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
begin
if WinInit <> 0 then
WinMain;
end.
> Но есть одно но по нажатию Shift + BackSpace он
> заменяет выделенный кусок текста...
Не понял, у меня ничего не происходит.
Kolan (2005-05-15 23:29:00) [3]
> Он ловит своим хуком сообщения клавиатуры
Это я понял.
> Если видит что нужно исправить, то "нажимает" BackSpace
> соотв число раз, а затем "набирает" текст по новой. Скорее
> всего, ловит только WM_CHAR.
А до вот этого не догодался.
Надо попробовать такое сделать.
Но есть одно но по нажатию Shift + BackSpace он заменяет выделенный кусок текста... Тут как он его считывает?
А с браузером, что дело иначе обстоит, проше чтоли? Только с IE?
Или слюбым.
В строке адрес как что-нибуди свое написать(хоть для IE)?
GuAV (2005-05-15 23:14:00) [4]
> А где это он проверяет что едит. Поясни пожалуйста
> если не трудно.
Нигде. Если в фокусе кнопка, то определится кнопка.
> Мне нужно что-то вроде того, как работает Punto
>Switcher
> http://www.punto.ru/
PS оказывается нифига не определяет Edit или не edit. Он ловит своим хуком сообщения клавиатуры. Если видит что нужно исправить, то "нажимает" BackSpace соотв число раз, а затем "набирает" текст по новой. Скорее всего, ловит только WM_CHAR.
Kolan (2005-05-15 22:45:00) [5]>GuAV © (14.05.05 23:23) [5]Конечно давай.
Мне нужно что-то вроде того, как работает Punto Switcher
http://www.punto.ru/
Если не знаешь, то эта программа проверяет текст введенный куда угодно и если раскладка неправильная, то стирает старый текст и заменяет на новый в нужной раскладке.
> если активен Edit
А где это он проверяет что едит. Поясни пожалуйста если не трудно.
Best regards,
Kolan
GuAV (2005-05-14 23:23:00) [6]
> Вопрос как это всё обрабатывать, те наверно надо
> глобальную клавишу назначить, или как ?
Зависит от конкретной задачи.
Пример [1] определяет окно в фокусе ввода, в т.ч. акивный Edit, если активен Edit.
Могу выслать прогу для ввода спец. символов по хоткею.
Kolan (2005-05-14 21:42:00) [7]Пошлите хоть куда-нибудь, на пример какой-нибудь ШО ли.
Kolan (2005-05-14 01:42:00) [8]Что то не доконца дошло.
var
H: THandle;
I1, I2: DWORD;
EditHandle: THandle;
TextToSet: PChar;
begin
H := GetForegroundWindow; //Получаем хендл окна где работает пользователь
I1 := GetCurrentThreadId; // Мой поток.
I2 := GetWindowThreadProcessId(H, nil); // Номер потока чюжого окна.
if not AttachThreadInput(I1, I2, True) then // Прикрепляем механизм ввода из одного потока в другой.
Exit;
H := GetFocus;
if H <> 0 then
begin
EditHandle := H;
TextToSet := PChar('ooo');
SendMessage(EditHandle, WM_SETTEXT, 0, Integer(TextToSet)); // Изменяем текст.
end;
AttachThreadInput(I1, I2, False);
end;
Вопрос как это всё обрабатывать, те наверно надо глобальную клавишу назначить, или как ?
Kolan (2005-05-14 01:30:00) [9]Ok пошел разбирать... Благодарю :)
GuAV (2005-05-14 01:14:00) [10]
var h: THandle; i1, i2: DWORD;
begin
h := GetForegroundWindow;
i1 := GetCurrentThreadId;
i2 := GetWindowThreadProcessId(h, nil);
if not AttachThreadInput(i1, i2, True) then Exit;
h := GetFocus;
if h <> 0 then
begin
// ....
end;
AttachThreadInput(i1, i2, False);
end;