Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
artem78
3 / 3 / 2
Регистрация: 20.12.2012
Сообщений: 406
1

Вставка текста в чужой программе

10.05.2016, 20:46. Просмотров 306. Ответов 1
Метки нет (Все метки)

Здравствуйте. Пишу программу, которая отлавливает нажатие коткея в чужой программе и вставляет некоторый текст. Как и положено, делаю через отдельную DLL.

DLL с хуком отправляет событие о нажатии моему окну:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
library keyhook;
 
uses
  Messages,
  Windows;
 
var
  HookHandle:hHook;
 
{$R *.res}
 
const
  MSG_HOTKEY = WM_USER + $110;
 
function KeyboardProc(Code: Integer; wParam: wParam; LParam: LParam): integer;
stdcall;
var
  key_no: byte;
begin
  if code<0 then
    Result:=CallNextHookEx(HookHandle, code, WParam, LParam)
  else
    Result:=CallNextHookEx(HookHandle, code, WParam, LParam);
    if (byte(LParam shr 24)<$80) // Только нажатие
        and ((GetKeyState(VK_CONTROL) and (1 shl 15)) <> 0) // Нажат Ctrl (левый или правый)
        and (byte (LParam shr 16) in [$2..$B]) // и клавиша "0" .. "9"
    then
    begin
      if byte (LParam shr 16) in [$2..$A] then
        key_no := byte (LParam shr 16) - 1
      else
        key_no := 0;
 
      PostMessage(FindWindow(nil, 'Заголовок моей программы'), MSG_HOTKEY, key_no, 0);
      Result := 1;
  end;
end;
 
procedure SetHook; stdcall;
begin
  HookHandle := SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInstance, 0);
end;
 
procedure DelHook; stdcall;
begin
  UnhookWindowsHookEx(HookHandle);
end;
 
exports
  SetHook, Delhook;
 
begin
end.

В программе установил функцию на обработку этого сообщения:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// .....
type
  TForm1 = class(TForm)
// ....
    procedure paste_phrase(var Message: TMessage); message MSG_HOTKEY;
 
 
// ..........
 
procedure TForm1.paste_phrase(var Message: TMessage);
var
  WindowHandle, EditHandle: HWnd;
  key_no: byte;
  Success: bool;
  RetryCount: integer;
 
begin
  LoadKeyboardLayout('00000419', 1); // Принудительно меняем раскладку на RU, иначе ломается кодировка
 
  key_no := Message.WParam;
  if key_no in [0..9] then
  begin
    WindowHandle := GetForegroundWindow; {активное окно}
    EditHandle := GetTopWindow(WindowHandle); {активный элемент}
 
    {копируем в буфер нужный текст}
    Success := false;
    RetryCount := 0;
    while not Success do
    begin
      try
        Clipboard.AsText := (FindComponent('Memo' + IntToStr(key_no)) as TMemo).Text;
        Success := True;
      except
        on Exception do
        begin
          Inc(RetryCount);
          if RetryCount <= CLIPBOARD_MAX_TRIES then
            Sleep(RetryCount * 100)
          else
            raise Exception.Create('Не могу записать в буфер обмена!');
        end;
      end;
    end;
 
    {эмуляция нажатия CTRL+V}
    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);
    SendMessage(EditHandle, WM_COMMAND, $00010043, $00000000);
 
    {очистка буфера}
    Success := false;
    RetryCount := 0;
    while not Success do
    begin
      try
        Clipboard.Clear();
        Success := True;
      except
        on Exception do
        begin
          Inc(RetryCount);
          if RetryCount <= CLIPBOARD_MAX_TRIES then
            Sleep(RetryCount * 100)
        end;
      end;
    end;
  end;
end;
 
// .....
Программа нормально работает с notepad++, а в браузере (проверял в Firefox, Chrome и Opera) работает как-то через раз - то вставляет, то нет. Чем это может быть вызвано?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2016, 20:46
Ответы с готовыми решениями:

Команды чужой программе
Подскажите пожалуйста, Как передать чужой программе следующие команды: 1)...

Вставка большого объема текста
Стоит задача вставить большое кол-во текста на форму(8 страниц a4). Причем в тексте есть еще...

Вставка вводимого текста в код программы
Здраствуйте! Пытаюсь разработать универсалбную программу... необходимо вставить вводимый...

Вывод текста в программе
Здравствуйте. Мне требуется создать программу клавиатурный тренажёр. Я примерно знаю как вывести...

Сохранение текста в программе
Я пишу простенькую программу тестирования. Всё как в любом тесте: вопрос и четыре варианта ответа....

1
artem78
3 / 3 / 2
Регистрация: 20.12.2012
Сообщений: 406
11.05.2016, 21:49  [ТС] 2
прикрепил проект
0
Вложения
Тип файла: zip prog.zip (325.4 Кб, 1 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2016, 21:49

Программный disconnect базы в чужой программе
Кто знает как программно разъединить соединенную базу чужой проги?

Delphi7 вставка текста из поля Memo в MS Word
Вечер добрый форумчане! Решил немного автоматизировать свою рабочую деятельность, и вот встал у...

Прикрепление формы к чужой программе
Нарыл такой код: procedure CreateParams( var params: TCreateParams ); override; procedure...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru