Форум: "WinAPI";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
ВнизКак получить Handle активного edit а (не моего). Найти похожие ветки
← →
Kolan © (2005-05-13 23:42) [0]Здравствуйте,
Как изменить текст Edit"а зная его хендл я нашел в FAQ"е, а вот как теперь узнать сам хендл? Хочу сделать что-то вроде PUntoSwitcher, те надо получить текст в активном Edit и изменить его.
← →
GuAV © (2005-05-14 01:14) [1]
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;
← →
Kolan © (2005-05-14 01:30) [2]Ok пошел разбирать... Благодарю :)
← →
Kolan © (2005-05-14 01:42) [3]Что то не доконца дошло.
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 21:42) [4]Пошлите хоть куда-нибудь, на пример какой-нибудь ШО ли.
← →
GuAV © (2005-05-14 23:23) [5]
> Вопрос как это всё обрабатывать, те наверно надо
> глобальную клавишу назначить, или как ?
Зависит от конкретной задачи.
Пример [1] определяет окно в фокусе ввода, в т.ч. акивный Edit, если активен Edit.
Могу выслать прогу для ввода спец. символов по хоткею.
← →
Kolan © (2005-05-15 22:45) [6]>GuAV © (14.05.05 23:23) [5] Конечно давай.
Мне нужно что-то вроде того, как работает Punto Switcher
http://www.punto.ru/
Если не знаешь, то эта программа проверяет текст введенный куда угодно и если раскладка неправильная, то стирает старый текст и заменяет на новый в нужной раскладке.
> если активен Edit
А где это он проверяет что едит. Поясни пожалуйста если не трудно.
Best regards,
Kolan
← →
GuAV © (2005-05-15 23:14) [7]
> А где это он проверяет что едит. Поясни пожалуйста
> если не трудно.
Нигде. Если в фокусе кнопка, то определится кнопка.
> Мне нужно что-то вроде того, как работает Punto
>Switcher
> http://www.punto.ru/
PS оказывается нифига не определяет Edit или не edit. Он ловит своим хуком сообщения клавиатуры. Если видит что нужно исправить, то "нажимает" BackSpace соотв число раз, а затем "набирает" текст по новой. Скорее всего, ловит только WM_CHAR.
← →
Kolan © (2005-05-15 23:29) [8]
> Он ловит своим хуком сообщения клавиатуры
Это я понял.
> Если видит что нужно исправить, то "нажимает" BackSpace
> соотв число раз, а затем "набирает" текст по новой. Скорее
> всего, ловит только WM_CHAR.
А до вот этого не догодался.
Надо попробовать такое сделать.
Но есть одно но по нажатию Shift + BackSpace он заменяет выделенный кусок текста... Тут как он его считывает?
А с браузером, что дело иначе обстоит, проше чтоли? Только с IE?
Или слюбым.
В строке адрес как что-нибуди свое написать(хоть для IE)?
← →
GuAV © (2005-05-16 01:07) [9]
> А с браузером, что дело иначе обстоит, проше чтоли?
>Только с 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-16 12:13) [10]
> Не понял, у меня ничего не происходит.
Не знаю у меня происходит:
Не понял, у меня ничего не происходит.
Yt gjyzkб e vtyz ybxtuj yt ghjbc[jlbnю
Код гляну :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.032 c