Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Как получить 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 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
14-1118834936
DVYdm
2005-06-15 15:28
2005.07.11
настройка Apache Server


4-1116235680
СМА
2005-05-16 13:28
2005.07.11
СОМ порт под WIN_XP


3-1117609080
Ярослав
2005-06-01 10:58
2005.07.11
ошибка Refresh ADODataSet


4-1116330535
Shuma
2005-05-17 15:48
2005.07.11
Виртуальный диск


1-1118405626
Vitalis
2005-06-10 16:13
2005.07.11
Работа со сканером