Народ, помогите пожалуйста.
Пытался сделать на Delphi экранную клавиатуру на подобии Виндовозной, проблема не с оформлением, а как сымитировать нажатие той или иной клавиши. Максимум что у меня получилось это открыть "пуск":
procedure TForm1.Button1Click(Sender: TObject);
begin
sendmessage(handle,wm_syscommand,sc_tasklist,0);
end;
![Фотография](https://vse.kz/uploads/av-37568.jpg?_r=0)
Помогите сделать экранную клавиатуру на Delphi
Автор CrazyDogNekkid, 08.06.2006, 01:45
#3
Отправлено 08.06.2006, 16:57:41
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
При нажатии на клавиатуру Windows генерирует несколько событий.
WM_KEYDOWN, WM_CHAR и WM_KEYUP.
Если вы удерживаете клавишу Alt во время нажатия пробел, минус и пробел F10, то эти события трансформируются в системные события и нажатия клавиш приложение в обычном обработчике WndProc не видит.
Т.о. чтобы сыимитировать нажатие нужно послать три сообщения окну приложения.
SendMessage( handle, WM_KEYDOWN, VK_XXX, ....
WPARAM это виртуальный код клавиши ...
относительно LPARAM нужно читать документацию в MSDN для событий KEYDOWN, KEYUP ...
WM_KEYDOWN, WM_CHAR и WM_KEYUP.
Если вы удерживаете клавишу Alt во время нажатия пробел, минус и пробел F10, то эти события трансформируются в системные события и нажатия клавиш приложение в обычном обработчике WndProc не видит.
Т.о. чтобы сыимитировать нажатие нужно послать три сообщения окну приложения.
SendMessage( handle, WM_KEYDOWN, VK_XXX, ....
WPARAM это виртуальный код клавиши ...
относительно LPARAM нужно читать документацию в MSDN для событий KEYDOWN, KEYUP ...
#4
Отправлено 08.06.2006, 18:54:46
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Так народ, я попробовал сделать следующее: я создал форму и кнопку и создал события на форме и кнопке OnKeyPress, в которых ввел проверку, если KEY = #27 {Esc} then form1.close. На кнопку я прописал SendMessage(handle,wm_keydown,vk_escape,0); и SendMessage(handle,wm_keyup,vk_escape,0); и вообщем форма не закрылась, поэтому прошу написать пример.
На всякий случай.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure Button1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
sendmessage(handle,wm_keyup,VK_ESCAPE,0);
sendmessage(handle,wm_keydown,VK_ESCAPE,0);
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key=#27 then close;
end;
procedure TForm1.Button1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#27 then close;
end;
end.
На всякий случай.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure Button1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
sendmessage(handle,wm_keyup,VK_ESCAPE,0);
sendmessage(handle,wm_keydown,VK_ESCAPE,0);
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key=#27 then close;
end;
procedure TForm1.Button1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#27 then close;
end;
end.
#5
Отправлено 08.06.2006, 23:19:51
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Полезно заглядывать не только в обычный дельфишный хелп, но и в Windows SDK ![:rolleyes:](http://vse.kz/public/style_emoticons/default/wink.gif)
The keybd_event function synthesizes a keystroke. The system can use such a synthesized keystroke to generate a WM_KEYUP or WM_KEYDOWN message. The keyboard driver's interrupt handler calls the keybd_event function.
VOID keybd_event(
BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);
Parameters
bVk
Specifies a virtual-key code. The code must be a value in the range 1 to 254.
bScan
Specifies a hardware scan code for the key.
dwFlags
A set of flag bits that specify various aspects of function operation. An application can use any combination of the following predefined constant values to set the flags:
Value Meaning
KEYEVENTF_EXTENDEDKEY If specified, the scan code was preceded by a prefix byte having the value 0xE0 (224).
KEYEVENTF_KEYUP If specified, the key is being released. If not specified, the key is being depressed.
dwExtraInfo
Specifies an additional 32-bit value associated with the key stroke.
Return Values
This function has no return value.
Remarks
Although keybd_event passes an OEM-dependent hardware scan code to Windows, applications should not use the scan code. Windows converts scan codes to virtual-key codes internally and clears the up/down bit in the scan code before passing it to applications.
An application can simulate a press of the PRINTSCREEN key in order to obtain a screen snapshot and save it to the Windows clipboard. To do this, call keybd_event with the bVk parameter set to VK_SNAPSHOT, and the bScan parameter set to 0 for a snapshot of the full screen or set bScan to 1 for a snapshot of the active window.
![:rolleyes:](http://vse.kz/public/style_emoticons/default/wink.gif)
The keybd_event function synthesizes a keystroke. The system can use such a synthesized keystroke to generate a WM_KEYUP or WM_KEYDOWN message. The keyboard driver's interrupt handler calls the keybd_event function.
VOID keybd_event(
BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);
Parameters
bVk
Specifies a virtual-key code. The code must be a value in the range 1 to 254.
bScan
Specifies a hardware scan code for the key.
dwFlags
A set of flag bits that specify various aspects of function operation. An application can use any combination of the following predefined constant values to set the flags:
Value Meaning
KEYEVENTF_EXTENDEDKEY If specified, the scan code was preceded by a prefix byte having the value 0xE0 (224).
KEYEVENTF_KEYUP If specified, the key is being released. If not specified, the key is being depressed.
dwExtraInfo
Specifies an additional 32-bit value associated with the key stroke.
Return Values
This function has no return value.
Remarks
Although keybd_event passes an OEM-dependent hardware scan code to Windows, applications should not use the scan code. Windows converts scan codes to virtual-key codes internally and clears the up/down bit in the scan code before passing it to applications.
An application can simulate a press of the PRINTSCREEN key in order to obtain a screen snapshot and save it to the Windows clipboard. To do this, call keybd_event with the bVk parameter set to VK_SNAPSHOT, and the bScan parameter set to 0 for a snapshot of the full screen or set bScan to 1 for a snapshot of the active window.
#6
Отправлено 09.06.2006, 12:02:35
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
keybd_event заменена в NT4/2000/XP на SendInput, но суть этих функций это вставка сообщений непосредственно в поток ввода клавиатуры, мыши. Необходимы эти функции например когда нужно сделать принтскрин, или если вы разрабатываете систему ввода голосом...
Для того чтобы ваше приложение могло отправлять сообщение другому окну достаточно сделать следующее
::SendMessage( (HWND)m_hWndReceiver, WM_KEYDOWN, 'A', 0 );
::SendMessage( (HWND)m_hWndReceiver, WM_CHAR, 'A', 0 );
::SendMessage( (HWND)m_hWndReceiver, WM_KEYUP, 'A', 0 );
Проверил работает.
В качестве m_hWndReceiver я использовал HWND полученный в Spy от окна приложения Notepad буква A в нем чудесно печатается...
Для того чтобы ваше приложение могло отправлять сообщение другому окну достаточно сделать следующее
::SendMessage( (HWND)m_hWndReceiver, WM_KEYDOWN, 'A', 0 );
::SendMessage( (HWND)m_hWndReceiver, WM_CHAR, 'A', 0 );
::SendMessage( (HWND)m_hWndReceiver, WM_KEYUP, 'A', 0 );
Проверил работает.
В качестве m_hWndReceiver я использовал HWND полученный в Spy от окна приложения Notepad буква A в нем чудесно печатается...
#7
Отправлено 10.06.2006, 00:38:37
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Большое спасибо dantl и Ultra-AM (конечно я не очень понял что ты написал, но приятно, когда народ не молчит). Я проверил, помоему достаточно только
::SendMessage( handle, WM_CHAR, vk_escape, 0 ); // по крайне мере в моем примере работает.
Ultra-AM ,а можно еще раз, а лучше пример, а еще лучше на Delphi пример (извини, если назойлив
).
::SendMessage( handle, WM_CHAR, vk_escape, 0 ); // по крайне мере в моем примере работает.
Ultra-AM ,а можно еще раз, а лучше пример, а еще лучше на Delphi пример (извини, если назойлив
![:(](http://vse.kz/public/style_emoticons/default/shy.gif)
#8
Отправлено 10.06.2006, 01:59:01
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
CrazyDogNekkid, это же как раз из дельфишного хелпа, только это хелп по функциям виндолс...
просто напишите keybd_event и поставьте скобку "("
выйдет хинт где написано что ей нужно, виртуальный код клавиши, скэн код, какой-то флаг и еще какое-то значение ...
последние два - просто числа. Непомню, возможно подойдут просто "0"...
попробуйте, хелп посмотрите...
правда она работает только с активным окном, т.е. то куда вам нужно послать символ - должно быть активным.
просто напишите keybd_event и поставьте скобку "("
выйдет хинт где написано что ей нужно, виртуальный код клавиши, скэн код, какой-то флаг и еще какое-то значение ...
последние два - просто числа. Непомню, возможно подойдут просто "0"...
попробуйте, хелп посмотрите...
правда она работает только с активным окном, т.е. то куда вам нужно послать символ - должно быть активным.
Количество пользователей, читающих эту тему: 1
пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0