我正在建立一个像触摸屏上的键盘一样的形式.我现在遇到的问题是,当我按下按钮例如"1"按钮时,它必须将该字符"1"添加到编辑框,该编辑框显示已经按下的按键.现在我遇到的问题是,一旦一个人按下一个键,我就可以将char添加到已经显示在编辑框中的字符串,但是光标会转到编辑框的前面,而不会出现在后面.我使用以下代码将char添加到编辑框:
edtPassword.text := edtPassword.text + key;
Run Code Online (Sandbox Code Playgroud)
现在,只需将char添加到编辑框的末尾,但如何将光标移动到编辑框的末尾.
另外我还有一个退格按钮,如果你点击它,我会用什么代码擦除编辑框中字符串的最后一个字符?
我正在使用Delphi XE2
免责声明:
我没有回答这个问题.当我需要虚拟键盘时,我正试图提出一种我宁愿遵循的方法.
1.现成的组件怎么样?
我建议你使用TTouchKeyboard代表虚拟键盘的组件,它是一个VCL组件.也就是说,你正在开发一些东西,这已经成为Delphi发行版的一部分.自2010年以来它是Delphi的一部分,但我不能说在哪个发行版中.
它看起来很难看,我宁愿做自己的:
当我TTouchKeyboard第一次看到组件时,我希望允许所有者绘图.好吧,不幸的是没有.在这种情况下,我会尝试自己模拟击键,而不是为你可能很快或以后使用的其他组件解决这样的情况.
2.1.如何以自己的方式模拟击键?
以下代码使用该SendInput函数模拟击键,它基于TTouchKeyboard组件使用的代码:
type
TKeyState = (ksDown, ksUp);
function SendInputKey(AVirtualKey: Integer; AScanCode: Integer;
AKeyState: TKeyState): Boolean;
var
Input: TInput;
begin
Input.Itype := INPUT_KEYBOARD;
if (AVirtualKey = -1) and (AScanCode >= 0) then
begin
Input.ki.wVk := MapVirtualKey(AScanCode, MAPVK_VSC_TO_VK);
Input.ki.wScan := AScanCode;
end
else if (AVirtualKey >= 0) and (AScanCode = -1) then
begin
Input.ki.wVk := AVirtualKey;
Input.ki.wScan := MapVirtualKey(AVirtualKey, MAPVK_VK_TO_VSC);
end
else if (AVirtualKey >= 0) and (AScanCode >= 0) then
begin
Input.ki.wVk := AVirtualKey;
Input.ki.wScan := AScanCode;
end;
case AKeyState of
ksDown: Input.ki.dwFlags := 0;
ksUp: Input.ki.dwFlags := KEYEVENTF_KEYUP;
end;
Result := SendInput(1, Input, SizeOf(TInput)) = 1;
end;
Run Code Online (Sandbox Code Playgroud)
以及上述功能的用法.您可以将虚拟密钥,扫描代码或两者传递给此功能.当你不确定它们中的任何一个时,传递值为-1,键MapVirtualKey函数将由函数另外映射.以下示例显示如何发送a Backspace然后Shift + A:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
SendInputKey(VK_BACK, -1, ksDown);
SendInputKey(VK_BACK, -1, ksUp);
SendInputKey(VK_SHIFT, -1, ksDown);
SendInputKey(Ord('A'), -1, ksDown);
SendInputKey(Ord('A'), -1, ksUp);
SendInputKey(VK_SHIFT, -1, ksUp);
end;
Run Code Online (Sandbox Code Playgroud)
2.2.如何以禁止的方式模拟击键?
您也可能违反参考并使用SendKeyfrom Vcl.Touch.Keyboard单元.在引用中声明它SendKey是在内部使用的,不应该被调用,但它在单元外可见,如果你足够大胆,你可以这样使用它:
uses
Vcl.Touch.Keyboard, Vcl.Touch.KeyboardTypes;
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
KeyData: TKeyData;
begin
KeyData := VKey(VK_BACK, -1);
SendKey(KeyData, ksDown);
SendKey(KeyData, ksUp);
KeyData := VKey(VK_SHIFT, -1);
SendKey(KeyData, ksDown);
KeyData := VKey(Ord('A'), -1);
SendKey(KeyData, ksDown);
SendKey(KeyData, ksUp);
KeyData := VKey(VK_SHIFT, -1);
SendKey(KeyData, ksUp);
end;
Run Code Online (Sandbox Code Playgroud)
2.3.如何在不同的视图中模拟击键?
How to send text to another application ?How to send keys to another application ?How to send keys without using SendMessage and PostMessage ?How to programmatically simulate user input ?| 归档时间: |
|
| 查看次数: |
1998 次 |
| 最近记录: |