|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Помогите, вставка текста в другую программу
Меняется название окна , а нужно заполнение Edit
Код:
program Project1; uses SysUtils, windows, dialogs, controls, messages; var s: pchar; h,h1: HWND; begin s:= 's11'; h := FindWindow(nil,'хендл программы'); h1 := FindWindowEx(h1, 0, 'EDIT', 'хендл программы'); SendMessage(h1, WM_SETTEXT, 0, LongInt(PCHAR(s))); end. |
#2
|
|||
|
|||
Delphi 10.1 Berlin
Вот так работает: Код:
procedure TForm1.Button1Click(Sender: TObject); const str : String = 'test string'; var hp : HWND; he :HWND; pstr : pchar; begin hp := FindWindow(nil,'TestMainForm'); If IsWindow(hp) Then Begin he := FindWindowEx(hp,0,'TEDIT',Nil); if IsWindow(he) Then Begin GetMem(pstr,SizeOf(Char)*(Length(str)+1)); Try ZeroMemory(pstr,SizeOf(Char)*(Length(str)+1)); StrPCopy(pstr,str); SendMessage(he,WM_SETTEXT,SizeOf(str),NativeInt(pstr)) Finally freeMem(pstr,SizeOf(Char)*(Length(str)+1)); End; End Else ShowMessage('Edit not found'); End Else ShowMessage('Main window not found.'); end; Что будет, если на форме несколько TEdit - не проверял. Может быть потребуется сделать EnumWindow/GetWindowInfo для определения какой именно нужен. |
#3
|
|||
|
|||
Цитата:
ShowMessage('Edit not found') выводит ошибку како делал иначе функция блокировок клавиш + клавиатура 10 сек далее через нажатие таб ввод таб ввод таб ентер работало но хромало а сейчас вообще не работает Последний раз редактировалось usfire, 06.12.2017 в 22:22. |
#4
|
|||
|
|||
Конечно выдает ошибку. У тебя родительского окна нет. Или это компилятор выдает? Короче, замени его на любую диагностику, это не принципиально, просто для отладки извещение, что нужное окно не найдено.
отсальной поток создания не распознан. выражай свои мысли более понятно. |
#5
|
|||
|
|||
Цитата:
lmikle , в предыдущий раз вы мне помогли , месяца 2 назад года 2 назад использовал такой код : Код:
program Project2; uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Dialogs, StdCtrls, Clipbrd; { TODO -oUser -cConsole Main : Insert code here } function FuncAvail(dllName,funcName: string; var p: pointer): boolean; var lib: THandle; begin result := true; p := nil; if LoadLibrary(PChar(dllName)) = 0 then exit; lib := GetModuleHandle(PChar(dllName)) ; if lib <> 0 then begin p := GetProcAddress(lib, PChar(funcName)) ; if p <> nil then Result := true; end; end; var BlockInput : function(Block: BOOL): BOOL; stdcall; h1:HWND; login, pas : string; begin if FuncAvail('USER32.DLL', 'BlockInput', @BlockInput) then begin login:='1@gmail.com'; BlockInput(true) ; h1:=FindWindow(nil,'Программа'); //PostMessage(h1,WM_KEYDOWN,VK_TAB, 0); //PostMessage(h1,WM_KEYUP,VK_TAB, 0); Clipboard.AsText:=PChar(login); keybd_event(VK_CONTROL, 0, 0, 0); keybd_event(Ord('V'), 0, 0, 0); keybd_event(Ord('V'), 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); sleep(500); PostMessage(h1,WM_KEYDOWN,VK_RETURN, 0); PostMessage(h1,WM_KEYUP,VK_RETURN, 0); // sleep(7000); BlockInput(false) ; end; end. |
#6
|
|||
|
|||
на энтер нажимает , а почту не вводит ,
может необходимо переписать вставку текста через : PostMessage или использовать ваш способ про родительское окно не дошло , запускал из project1.exe |
#7
|
|||
|
|||
По поводу ShowMessage. Эта функция, походу, требует наличие окна приложения, Application. Соотв. оно и валится, т.к. у тебя его нет. Но, как я уже сказал, она там просто для вывода сообщения об ошибке (окно не найдено), так что может быть заменена на что угодно. Например, добавь директиву создавать коснольное приложение и замени ShowMessage на WriteLn.
А по поводу второго куска текста. 1. Создай приложение с WebBrawser и рули им. Это гораздо проще, т.к. есть прямой доступ к внутреннему документу web страницы в таком варианте. 2. Вообще, подключайся через POP3S и работай напрямую с почтой (TIdPOP3 + OpenSSL). А разбираться почему что-то не работает в подобном коде - дело бессмысленное, т.к. все очень сильно зависит от сторонних программ. Я, например, твою проблему просто не смогу воспроизвести. А тот код, который работает у меня, у тебя может не заработать, т.к. приложение, которым ты пытаешься управлять, совершенно другое, нежели у меня. |
#8
|
|||
|
|||
PostMessage(h1, WM_KeyDown, Ord('2'), 0);
PostMessage(h1, WM_KeyDown, 50, 0); как вставить спецсимвол @ не 2 а @ //SendMessage(h1, WM_KEYUP, 50, 0); вставка текста не работает программное нажатие клавиш работает |
#9
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#10
|
|||
|
|||
Цитата:
а можно с рабочим кодом ? тут немного в перемешку PostMessage(h1, WM_KeyDown, VK_SHIFT, 0); PostMessage(h1, WM_KeyDown, KEYEVENTF_EXTENDEDKEY, 0); PostMessage(h1, WM_KeyDown, Ord('2'), 0); пишет 2 а нужно @ PostMessage(h1, WM_KeyDown, VK_SHIFT + KEYEVENTF_EXTENDEDKEY + Ord('2'), 0); выводит букву 'c' Последний раз редактировалось usfire, 10.12.2017 в 16:58. |
#11
|
||||
|
||||
Цитата:
Код:
PostMessage(h1, WM_CHAR, 64, 0); Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
usfire (10.12.2017)
|
#12
|
|||
|
|||
Цитата:
работает , даже нечем вас отблагодарить , зп второй месяц задерживают , в наличии есть немного трафика + сервера |
#13
|
||||
|
||||
Оффтоп: Советы у нас вообще-то бесплатные лучше, если будут вопросы - приходите ещё
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#14
|
|||
|
|||
Цитата:
а как сделать принудительно нижний региср без контроля регистра выводит 50 % / 50 % USFIRE usfire где то видел похожую тему , ща поищу Код:
Text:='USFIRE'; for i := 1 to Length(Text) do PostMessage(h1, WM_KeyDown, Ord(Text[i]), 0); |
#15
|
||||
|
||||
Цитата:
Код:
function loCs(ch: char): char; begin if (ch in ['A'..'Z', 'А'..'Я']) then Result:= chr(ord(ch) + 32) else Result:= ch; end; Код:
PostMessage(h1, WM_CHAR, Word(loCs(Text[i])), 0); Я не понял Вашего вопроса, но всё же Вам на него отвечу! |