![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 твоим кодом