Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
EndoCrinolog
1 / 1 / 2
Регистрация: 02.07.2013
Сообщений: 91
#1

Отправка нажатой клавиши в чужое окно - Delphi

23.08.2016, 00:26. Просмотров 239. Ответов 1
Метки нет (Все метки)

Вот листинг программы, которая 1) получает открытые окна 2) получает их HWnd 3) ПЫТАЕТСЯ отправить нажатую клавишу:
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
74
75
76
77
78
79
80
81
82
83
84
85
86
unit Main;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    ListBox1: TListBox;
    Label2: TLabel;
    Memo1: TMemo;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  wnd: hwnd;
  buff: array [0..127] of char;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
  getwnd: hwnd;
  li : longint;
  sm : String;
begin
  if ( Label2.Caption <> 'NONE' ) then
  begin
    getwnd := StrToInt( Label2.Caption );
    if getasynckeystate($20)<>0 then
    begin
      li := SendMessage(getwnd, wm_char, ord('M'), 0);
      sm := IntToStr(li);
      Label1.Caption := sm;
    end;
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Label2.Caption := 'NONE';
  ListBox1.clear;
  wnd := GetWindow(handle, gw_hwndfirst);
  while wnd <> 0 do 
  begin // ГЌГҐ ïîêГ*çûâГ*ГҐГ¬:
    if (wnd <> Application.Handle) // ÑîáñòâåГ*Г*îå îêГ*Г®
    and IsWindowVisible(wnd) // Íåâèäèìûå îêГ*Г*
    and (GetWindow(wnd, gw_owner) = 0) // Äî÷åðГ*ГЁГҐ îêГ*Г*
    and (GetWindowText(wnd, buff, SizeOf(buff)) <> 0) then
    begin
      GetWindowText(wnd, buff, SizeOf(buff));
      ListBox1.Items.Add(StrPas(buff) + ' || ' +  IntToStr(wnd));
    end;
    wnd := GetWindow(wnd, gw_hwndnext);
  end;
  ListBox1.ItemIndex := 0;
end;
 
procedure TForm1.ListBox1Click(Sender: TObject);
var
  t1 : TStringList;
  current : String;
begin
  current := ListBox1.Items[ ListBox1.ItemIndex ];
  t1 := TStringList.Create;
  t1.Text:= StringReplace(current, ' || ', #13#10, [rfReplaceAll]);
  //Label2.Caption := StringReplace(t1[1], ')', '', [rfReplaceAll]);
  Label2.Caption := t1[1];
  Memo1.Text := t1.Text;
  t1.Clear;
end;
 
end.
При нажатии пробела делается SendMessage в окно по указанному id в поле Label2. При этом, в Label1 записывается переменна li, которой присвоен sendmessage, и это значение 0.
У меня 2 вопроса:
1) почему не отправляется нажатая клавиша в окно?
http://www.cyberforum.ru/delphi-beginners/thread1890450.html
2) как мне преобразовать нажатую клавишу в вид,
Delphi
1
2
3
4
5
6
 if getasynckeystate($20)<>0 then
    begin
      li := SendMessage(getwnd, wm_char, ord('M'), 0);
      sm := IntToStr(li);
      Label1.Caption := sm;
    end;
который можно будет отправить в окно?

P.S. Список объектов
http://www.cyberforum.ru/attachment....1&d=1471901191
0
Изображения
 
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2016, 00:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Отправка нажатой клавиши в чужое окно (Delphi):

Код нажатой клавиши.
Добрый день! Не как не могу сделать чтобы из ShowMessage была считана...

Сравнение нажатой клавиши с эл-ом массива
Ребят, помогите написать процедуру для сравнения нажатой клавиши клавиатуры с...

Виртуальный код нажатой клавиши
Подскажите пожалуйста как это можно сделать? Задание: Напишите приложение,...

Отображение названия и кода нажатой функциональной клавиши
Создать на форме Form3 поля Label1 i Label2 для отображения названия и кода...

Вывести подсчеты времени удержания нажатой любой клавиши управления курсором
Создать на форме Form3 поле Label4, в котором вывести подсчеты времени...

1
EndoCrinolog
1 / 1 / 2
Регистрация: 02.07.2013
Сообщений: 91
23.08.2016, 10:01  [ТС] #2
Проблема в том, что мне не подходит поиск окна по имени - у меня несколько окон с одинаковыми именами, поэтому, нужно отправить нажатие клавиши в то окно, id которого я укажу

Добавлено через 46 минут
Протестировал ShowWindow(getwnd, SW_HIDE); через полученный id - окно свернулось при нажатии пробела... То есть, всё работает. Тогда, почему не отправляется клавиша?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2016, 10:01
Привет! Вот еще темы с решениями:

Скрыть чужое окно
Привет всем. Можно ли как то скрыть окно стороннего приложения? Добавлено...

Как узнать что чужое приложение(окно) перешло в полноэкранный режим?
Надо чтобы моя программа не выводила окно, если окно чужого приложения заняло...

Определение нажатой клавиши в свернутом виде
Люди, help! Помогите начинающему, plz! Как определить в приложении, какая...

Задаем действие для нажатой клавиши
Здравствуйте дорогие форумчане ... как мне сделать что бы при нажатии стрелки...


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

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

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