@会网络的老鼠

涂飞平的博客空间

完成了一个简版屏幕键盘

10 年前 0

Windows自带了一个OSK.EXE程序,是一个功能很强大的屏幕键盘。今天没有什么事情,将原来没有写完的一个简版的屏幕键盘程序写完整了。没有什么技术含量,只要注意两点就可以了。
1、一般程序在窗体被点击(被提前到Z-Order序最前面)后将自动获取焦点(同时获取输入队列),而屏幕键盘主要的技术要点就是当窗体被提到前面后,窗体没有获取焦点(没有改变输入队列)。这个其实很简单就可以实现,下面是代码:

procedure TMainForm.FormCreate(Sender: TObject);
var
exs, l, t: DWORD;
begin
exs := GetWindowLong(Handle, GWL_EXSTYLE);
exs := exs or WS_EX_NOACTIVATE;//始终不处于活动状态
//仅接收鼠标输入
SetWindowLong(Handle, GWL_EXSTYLE, exs);
l := ((Screen.WorkAreaRect.Right - Screen.WorkAreaRect.Left) - Width) div 2;
t := (Screen.WorkAreaRect.Bottom - Screen.WorkAreaRect.Top) - Height;
SetWindowPos(Handle, HWND_TOPMOST, l, t, 0, 0, SWP_NOACTIVATE or SWP_NOSIZE);
KDX := (GetKeyState(VK_CAPITAL) and 1 = 1);
end;
2、模拟键盘的输入消息,这个Windows有相关的函数-SendInput,使用起来相当简单,下面是代码:
procedure TMainForm.fKeyDown(Vk: Word);
var
ipt: array[0..1] of tagINPUT;
begin
ZeroMemory(@ipt[0], sizeof(tagINPUT) * 2);
ipt[0].Itype := INPUT_KEYBOARD;
ipt[0].ki.wVk := Vk;
ipt[1].Itype := INPUT_KEYBOARD;
ipt[1].ki.wVk := Vk;
ipt[1].ki.dwFlags := KEYEVENTF_KEYUP;
SendInput(2, ipt[0], sizeof(tagINPUT));
end;
点击‘A'键的时候,你只要调用fKeyDown($41);即可。

好了,写到这里,消夜去了^_^
图片:kb.jpg
kb.jpg

编写评论