Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.093 c
14-1118266167
Megabyte
2005-06-09 01:29
2005.07.11
Хороший ФАК по FIB


1-1118397912
Dysan
2005-06-10 14:05
2005.07.11
помогите понять в чем причина возникновения ошибки!


6-1112766078
M@Z
2005-04-06 09:41
2005.07.11
NetShareAdd


5-1088818458
antonn
2004-07-03 05:34
2005.07.11
TPersistent &amp; Co


4-1116082031
TForm1
2005-05-14 18:47
2005.07.11
Запуск внутри...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский