我正在撰写Global Hook程序。使用SendInput发送ascii(< 255)和Unicode字符。到目前为止它运作良好。
但在我的语言中,泰米尔语中有一些字符是组合字符,没有Unicode代码点。所以在字体中有255以上定义的字形。
如何为他们发送虚拟密钥代码?
虽然这些字形没有代码点,但它们具有字形名称,如u0BAF_u0BBF。第一和第二部分用Unicode定义。这些名称称为命名序列,并由Unicode批准
代码:
procedure GenUKey(const vk: integer; const bUnicode: bool);
var
kb: TKEYBDINPUT;
Input: TINPUT;
begin
{keydown}
{ ZeroMemory(@kb,sizeof(kb));}
{ ZeroMemory(@input,sizeof(input));}
{keydown}
if bUnicode then
begin
kb.wVk:= 0;
kb.wScan:= vk; ;
kb.dwFlags:= $4;
{ KEYEVENTF_UNICODE=4}
end
else
begin
kb.wVk:= vk;
kb.wScan:= 0; ;
kb.dwFlags:= 0;
end;
Input.itype:= INPUT_KEYBOARD;
Input.ki:= kb;
SendInput(1, Input,sizeof(Input));
{keyup}
if bUnicode then
begin
kb.wVk:= 0;
kb.wScan:= vk ;
kb.dwFlags:= $4 or KEYEVENTF_KEYUP;
{KEYEVENTF_UNICODE=4}
end
else
begin
kb.wVk:= vk;
kb.wScan:= 0;
kb.dwFlags:= KEYEVENTF_KEYUP;
end;
Input.itype:= INPUT_KEYBOARD;
Input.ki:= kb;
SendInput(1,Input,sizeof(Input));
end;
编辑:
是的,我确实单独发送每个代码点。每个代码点都附有字形。还有另一个结合两者的设计。它在视觉上看起来更好,并且表现为一个角色。由于它是单独定义的,我认为应该有一种使用sendinput发送的方法。
EDIT2:
还有一些不能机械组合的字符
编辑3:
测试证明Rob Kennedy是正确的。第二个代码点不是机械显示的。它与第一个智能组合以获得第三个新的组合字形。使用字形(名称)编码。我以编程方式执行相同操作的代码干扰了此过程,因此也解决了问题。很多谢谢