Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.12.2017, 00:29
usfire usfire вне форума
Прохожий
 
Регистрация: 25.02.2016
Сообщения: 20
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Помогите, вставка текста в другую программу

Меняется название окна , а нужно заполнение 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  
Старый 06.12.2017, 06:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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'ом.
Что будет, если на форме несколько TEdit - не проверял. Может быть потребуется сделать EnumWindow/GetWindowInfo для определения какой именно нужен.
Ответить с цитированием
  #3  
Старый 06.12.2017, 22:18
usfire usfire вне форума
Прохожий
 
Регистрация: 25.02.2016
Сообщения: 20
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
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'ом.
Что будет, если на форме несколько TEdit - не проверял. Может быть потребуется сделать EnumWindow/GetWindowInfo для определения какой именно нужен.

ShowMessage('Edit not found')


выводит ошибку


како делал иначе функция блокировок клавиш + клавиатура 10 сек

далее через нажатие таб ввод таб ввод таб ентер

работало но хромало


а сейчас вообще не работает

Последний раз редактировалось usfire, 06.12.2017 в 22:22.
Ответить с цитированием
  #4  
Старый 06.12.2017, 23:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Конечно выдает ошибку. У тебя родительского окна нет. Или это компилятор выдает? Короче, замени его на любую диагностику, это не принципиально, просто для отладки извещение, что нужное окно не найдено.

отсальной поток создания не распознан. выражай свои мысли более понятно.
Ответить с цитированием
  #5  
Старый 07.12.2017, 01:14
usfire usfire вне форума
Прохожий
 
Регистрация: 25.02.2016
Сообщения: 20
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Конечно выдает ошибку. У тебя родительского окна нет. Или это компилятор выдает? Короче, замени его на любую диагностику, это не принципиально, просто для отладки извещение, что нужное окно не найдено.

отсальной поток создания не распознан. выражай свои мысли более понятно.

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  
Старый 07.12.2017, 01:22
usfire usfire вне форума
Прохожий
 
Регистрация: 25.02.2016
Сообщения: 20
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

на энтер нажимает , а почту не вводит ,


может необходимо переписать вставку текста через :

PostMessage


или использовать ваш способ

про родительское окно не дошло ,

запускал из project1.exe
Ответить с цитированием
  #7  
Старый 07.12.2017, 07:53
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

По поводу ShowMessage. Эта функция, походу, требует наличие окна приложения, Application. Соотв. оно и валится, т.к. у тебя его нет. Но, как я уже сказал, она там просто для вывода сообщения об ошибке (окно не найдено), так что может быть заменена на что угодно. Например, добавь директиву создавать коснольное приложение и замени ShowMessage на WriteLn.

А по поводу второго куска текста.
1. Создай приложение с WebBrawser и рули им. Это гораздо проще, т.к. есть прямой доступ к внутреннему документу web страницы в таком варианте.
2. Вообще, подключайся через POP3S и работай напрямую с почтой (TIdPOP3 + OpenSSL).
А разбираться почему что-то не работает в подобном коде - дело бессмысленное, т.к. все очень сильно зависит от сторонних программ. Я, например, твою проблему просто не смогу воспроизвести. А тот код, который работает у меня, у тебя может не заработать, т.к. приложение, которым ты пытаешься управлять, совершенно другое, нежели у меня.
Ответить с цитированием
  #8  
Старый 10.12.2017, 15:15
usfire usfire вне форума
Прохожий
 
Регистрация: 25.02.2016
Сообщения: 20
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

PostMessage(h1, WM_KeyDown, Ord('2'), 0);

PostMessage(h1, WM_KeyDown, 50, 0);


как вставить спецсимвол @


не 2 а @


//SendMessage(h1, WM_KEYUP, 50, 0);


вставка текста не работает

программное нажатие клавиш работает
Ответить с цитированием
  #9  
Старый 10.12.2017, 16:27
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от usfire
...как вставить спецсимвол @

не 2 а @
А как он с клавиатуры набивается - shft+2 плюс латинская раскладка, так и с посылом нажатий: WM_KeyDown с VK_SHIFT + KEYEVENTF_EXTENDEDKEY + Ord('2')
Ответить с цитированием
  #10  
Старый 10.12.2017, 16:36
usfire usfire вне форума
Прохожий
 
Регистрация: 25.02.2016
Сообщения: 20
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
А как он с клавиатуры набивается - shft+2 плюс латинская раскладка, так и с посылом нажатий: WM_KeyDown с VK_SHIFT + KEYEVENTF_EXTENDEDKEY + Ord('2')

а можно с рабочим кодом ?


тут немного в перемешку


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  
Старый 10.12.2017, 19:15
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от usfire
...пишет 2 а нужно @...
Вот так попробуйте
Код:
PostMessage(h1, WM_CHAR, 64, 0);
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
usfire (10.12.2017)
  #12  
Старый 10.12.2017, 19:40
usfire usfire вне форума
Прохожий
 
Регистрация: 25.02.2016
Сообщения: 20
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Вот так попробуйте
Код:
PostMessage(h1, WM_CHAR, 64, 0);


работает ,


даже нечем вас отблагодарить ,


зп второй месяц задерживают ,


в наличии есть немного трафика + сервера
Ответить с цитированием
  #13  
Старый 10.12.2017, 19:44
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Оффтоп: Советы у нас вообще-то бесплатные лучше, если будут вопросы - приходите ещё
Ответить с цитированием
  #14  
Старый 10.12.2017, 20:21
usfire usfire вне форума
Прохожий
 
Регистрация: 25.02.2016
Сообщения: 20
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Оффтоп: Советы у нас вообще-то бесплатные лучше, если будут вопросы - приходите ещё


а как сделать принудительно нижний региср


без контроля регистра выводит 50 % / 50 %


USFIRE usfire


где то видел похожую тему , ща поищу


Код:
Text:='USFIRE';
for i := 1 to Length(Text) do
PostMessage(h1, WM_KeyDown, Ord(Text[i]), 0);
Ответить с цитированием
  #15  
Старый 10.12.2017, 23:30
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от usfire
а как сделать принудительно нижний региср...
А что ж вы упорно WM_KeyDown шлёте, она на пробеле и закисает, для всего набора символов лучше слать WM_CHAR, а чтоб был "нижний региср" можно добавить такую функцию
Код:
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);
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:35.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter