Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

sendkey в неактивном окне как hotkey [D7, XP]


porting ©   (2007-05-04 05:38:00) 

Приветствую всех собственно как реализовать hotkey в sendkey+неактивное окно?
Максимум что получилось это сендекей в неактивном окне, но опять же надо нажимать на кнопку на форме что бы сендкей работал.

вот так она определяет имя окна и нажимает в неактивном окне нужную кнопку клавы.
procedure TForm1.Button3Click(Sender: TObject);
begin
SendKeys1.GetWindowHandle('test 2');

if SendKeys1.WindowHandle <> 0 then

SendKeys1.SendKeys(Chr($39));

end;

Что надо зделать что бы это работала не по нажатию кнопки, а по нажатию горчих клавиш на клавературе например shift+9.

Например: есть test 1 окно активное, и test 2 не активное и чтобы работая в окне test 1 нажимая горячие клавишы нажималися в окне test2.


Германн   (2007-05-07 03:26:00) [1]

Я страдаю ерундой! Помогите мне получить от этого удовольствие.


porting   (2007-05-07 03:09:00) [2]

а как зделать нажатие кнопок, а не при нажатие горячих клавиш вставлять текст ?
PostMessage(FindWindow(nil, 'testwindow'), WM_KEYDOWN, VK_CONTROL, $00000039); так или как точно ? и вобще где можно почитать подробно о PostMessage.


Leonid Troyanovsky   (2007-05-06 09:30:00) [3]


> porting ©   (05.05.07 20:57) [7]

> мб есть другой способ как написать hotkey на неактивное
> приложения что бы принажатие горячий клавиш в неактивном
> окне которое будет распознано, нажималася определённая клавиша
> например это будет клавиша 9 (в щеснадцатеричном числе это
> будет $39).

PostMessage(FindWindowEx(FindWindow('Notepad', nil), 0, 'EDIT', nil), WM_CHAR, Ord('9'), 0);

--
Regards, LVT.


porting   (2007-05-05 20:57:00) [4]

ок. Значит так! На рабочем столе вызванно 2 notepad.exe один активный нотепад, второй нет. Надо что бы в неактивном нотепаде нажималася кнопка 9 - $39, а активный был всегда активным даже когда нажимается горячия кнопка. так понятней ? в этом исходник что выложил выше всё нажимается и передаётся как надо, но! при нажатие горячий клавиш все окна становятся не активными...
мб есть другой способ как написать hotkey на неактивное приложения что бы принажатие горячий клавиш в неактивном окне которое будет распознано, нажималася определённая клавиша например это будет клавиша 9 (в щеснадцатеричном числе это будет $39).


Leonid Troyanovsky   (2007-05-05 19:20:00) [5]


> porting ©   (05.05.07 16:59) [5]

Объясни словами, что конкретно требуется.
Какой программе и что нужно посылать.

--
Regards, LVT.


porting   (2007-05-05 16:59:00) [6]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Sendkey1, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   SendKeys1: TSendKeys;
   Button2: TButton;
   Button3: TButton;
   Button4: TButton;
   Button5: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure Button4Click(Sender: TObject);
   procedure Button5Click(Sender: TObject);
 private
   procedure  WM_KeyPress  (var Message: TMessage);
message WM_HOTKEY;

   { Private declarations }
 public
   { Public declarations }
 end;

var
  Form1: TForm1;
   keyid:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 SendKeys1.GetWindowHandle('Безымянный - Блокнот');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
SendKeys1.SendKeys(Chr($39));

end;

procedure TForm1.Button4Click(Sender: TObject);
begin
close;
end;

procedure TForm1.WM_KeyPress (var Message: TMessage);
 var
   idHotKey: integer;
   fuModifiers: word;
   uVirtKey: word;
begin

SendKeys1.SendKeys(Chr($39));

 if (fuModifiers = MOD_SHIFT) AND (uVirtKey = VK_F9) then
   caption:='Shift-F9 Проверка';
 inherited;
end;

procedure TForm1.Button5Click(Sender: TObject);

begin
keyid:=GlobalAddAtom('VK_9');
RegisterHotKey(handle, keyid, MOD_SHIFT, VK_F9);
end;

end.

Вот полный исходик, допустим это будет 2 блокнота перый блокнот должен быть активным, второй не активный и при нажатие горячих клавиш во второй блокнот должна нажиматся клавиша, для примера взял клавишу 9 - $39 так вот всё нажимается, но только все окна каторые находятся в данные момент открытие и активные становятся сразу не активные при нажатие гор клавиш.


Leonid Troyanovsky   (2007-05-05 10:13:00) [7]


> porting ©   (04.05.07 05:38)  

> и чтобы работая в окне test 1 нажимая горячие клавишы нажималися
> в окне test2.

Что за окно test2 и какие, собс-но, клавиши требуется "нажать".

--
Regards, LVT.


porting   (2007-05-05 04:31:00) [8]

собственно не только окно test 1 становится не активным, а все окна как зделать чтобы активное окно не слетало??


porting   (2007-05-04 16:06:00) [9]

procedure TForm1.Button3Click(Sender: TObject);
begin
SendKeys1.GetWindowHandle('test 2');
end;

procedure TForm1.WM_HotKeyHandler (var Message: TMessage);
 var
   idHotKey: integer;
   fuModifiers: word;
   uVirtKey: word;
begin
SendKeys1.SendKeys(Chr($39));
 

 if (fuModifiers = MOD_SHIFT) AND (uVirtKey = VK_F9) then
   caption:='Shift-F9 Нажата';
 inherited;
end;

Вроде что-то получилось но есть одна проблема теперь при нажатие горячих клавиш окно которое должно быть активным становится не активным как это зделать ? Тоесть надо что бы окно test 1 было активным постоянно.


ЮЮ   (2007-05-04 06:24:00) [10]

Написать код не в обработчике OnClick кнопки, а в обработчике, который будет вызван по нажатию горчих клавиш на клавературе например shift+9.


З.Ы. А как вводить символ '(' в поле ввода при такой "горячей клавише"?
Посмотри комбинации, предлагаемве в TAction.ShortCut. Кстати, достатчно будет создать TActionList, а в нем TAction c твоим кодом


Наверх

Титульная страница Поиск, карта сайта Написать письмо