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

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

23.08.2016, 00:26. Просмотров 251. Ответов 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) почему не отправляется нажатая клавиша в окно?
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
Ответы с готовыми решениями:

Перетащить чужое окно за созданную в нём панель
Есть чужое окно, создаю там панель, можно как то за неё мышкой перетаскивать...

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

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

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

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

1
EndoCrinolog
1 / 1 / 2
Регистрация: 02.07.2013
Сообщений: 109
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

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

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

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


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

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

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