люди добрые, подсказку дайте, как реализовать это в л2. Пробывал искать классы поля ввода логина и пароля, но все объекты клиента, представляют собой один класс....как L2WindowW.... следовательно сюда ничего не передается. Есть вариант через запись в память, адреса логина и пароля вроде как не меняются. И они не динамичные. Но есть проблемы с передачей текста в память. И нажатие кнопки войти... Может есть у кого какие идеи?
на счет вызова апи клиента, думаю самый хороший вариант, но я с этим не справлюсь..... На счет редактирования л2 ини не знал. Попробую... других вариантов нет? есть же программы авто входа, Как вот они работают
зато в моем случае на клиенте нет никакой защиты - думаю обычными винапями можно обойтись. даже есть алгоритм на том-же форуме: GetWindow на окно приложения
SetWindowText логин
потом кеу на таб
SetWindowText пасс
key на интер кажеться три раза на вход агрии с правилами и вход сервер
SetWindowText логин
потом кеу на таб
SetWindowText пасс вот тут малость не понятно
ведь функция SetWindowText изменяет заголовок окна. Зачем это вообще? Не пойму
я сижу сейчас с телефона. Ты сказал там где то алгоритм есть, можно код его сюда? Или ссылку
SetWindowText логин
потом кеу на таб
SetWindowText пасс вот тут малость не понятно
ведь функция SetWindowText изменяет заголовок окна. Зачем это вообще? Не пойму
я сижу сейчас с телефона. Ты сказал там где то алгоритм есть, можно код его сюда? Или ссылку
эм... за что купил - зато продал там видимо не сетвиндовстекст, а сенд подразумевался. типа посылать окну нажатые клавиши. то есть принцип как банальные кликеры работают, только вместо всяких F1 - ввод логина и пароля. когда окно ладвы загружается - там автоматом фокус ввода на логине, при нажатии таб - перепрыгивает на пароль. и ентыром происходит вход, потом окно соглашения...
procedure PostKeyExHWND(hWindow: HWnd; key: Word; const shift: TShiftState; specialkey: Boolean); {************************************************************ * Procedure PostKeyEx * * Parameters: * hWindow: target window to be send the keystroke * key : virtual keycode of the key to send. For printable * keys this is simply the ANSI code (Ord(character)). * shift : state of the modifier keys. This is a set, so you * can set several of these keys (shift, control, alt, * mouse buttons) in tandem. The TShiftState type is * declared in the Classes Unit. * specialkey: normally this should be False. Set it to True to * specify a key on the numeric keypad, for example. * If this parameter is true, bit 24 of the lparam for * the posted WM_KEY* messages will be set. * Description: * This procedure sets up Windows key state array to correctly * reflect the requested pattern of modifier keys and then posts * a WM_KEYDOWN/WM_KEYUP message pair to the target window. Then * Application.ProcessMessages is called to process the messages * before the keyboard state is restored. * Error Conditions: * May fail due to lack of memory for the two key state buffers. * Will raise an exception in this case. * NOTE: * Setting the keyboard state will not work across applications * running in different memory spaces on Win32 unless AttachThreadInput * is used to connect to the target thread first. *Created: 02/21/96 16:39:00 by P. Below ************************************************************}
type TBuffers = array [0..1] of TKeyboardState; var pKeyBuffers: ^TBuffers; lParam: LongInt; begin (* check if the target window exists *) if IsWindow(hWindow) then begin (* set local variables to default values *) //pKeyBuffers := nil; lParam := MakeLong(0, MapVirtualKey(key, 0));
(* modify lparam if special key requested *) if specialkey then lParam := lParam or $1000000;
(* allocate space for the key state buffers *) New(pKeyBuffers); try (* Fill buffer 1 with current state so we can later restore it. Null out buffer 0 to get a "no key pressed" state. *) GetKeyboardState(pKeyBuffers^[1]); FillChar(pKeyBuffers^[0], SizeOf(TKeyboardState), 0);
(* set the requested modifier keys to "down" state in the buffer*) if ssShift in shift then pKeyBuffers^[0][VK_SHIFT] := $80; if ssAlt in shift then begin (* Alt needs special treatment since a bit in lparam needs also be set *) pKeyBuffers^[0][VK_MENU] := $80; lParam := lParam or $20000000; end; if ssCtrl in shift then pKeyBuffers^[0][VK_CONTROL] := $80; if ssLeft in shift then pKeyBuffers^[0][VK_LBUTTON] := $80; if ssRight in shift then pKeyBuffers^[0][VK_RBUTTON] := $80; if ssMiddle in shift then pKeyBuffers^[0][VK_MBUTTON] := $80;
(* make out new key state array the active key state map *) SetKeyboardState(pKeyBuffers^[0]); (* post the key messages *) if ssAlt in Shift then begin PostMessage(hWindow, WM_SYSKEYDOWN, key, lParam); PostMessage(hWindow, WM_SYSKEYUP, key, lParam or integer($C0000000)); end else begin PostMessage(hWindow, WM_KEYDOWN, key, lParam); PostMessage(hWindow, WM_KEYUP, key, lParam or integer($C0000000)); end; (* process the messages *) //ad.ToLogFile('Before ProcessMessages PostKeyExHWND'); Application.ProcessMessages;
(* restore the old key state map *) SetKeyboardState(pKeyBuffers^[1]); finally (* free the memory for the key state buffers *) if pKeyBuffers <> nil then Dispose(pKeyBuffers); end; { If } end; end; { PostKeyEx }
function InsertText(text: string; winHandle: HWND): boolean; var i: word; ThreadID, my: cardinal; hFocusedWnd: HWND; ch: integer; begin ThreadID:= GetWindowThreadProcessId(winHandle, nil); my:= GetCurrentThreadId; AttachThreadInput(ThreadID, my, true); hFocusedWnd:= GetFocus;
for i:= 1 to Length(text) do begin ch:= ord(text[i]); PostMessage(hFocusedWnd, WM_CHAR, ch, 1); end; AttachThreadInput(ThreadID, my, false); Result:= true; Sleep(300); end;
.... var clientHWND: HWND; .... clientHWND:= FindWindow('l2UnrealWWindowsViewportWindow', nil);