勝手にPart2
ってな事で、結果的にVistaでは上手くいかない。
今は懐かしVBではSendKeyでやってたんだね。
これってVistaでも正常に動作するんですよね。
そこで imm云々は捨てて・・・
Unit1
****---------------------------------****
const
arrStrKana :array [0..80] of String = (
'ア','イ','ウ','エ','オ',
'ァ','ィ','ゥ','ェ','ォ',
'カ','キ','ク','ケ','コ',
'ガ','ギ','グ','ゲ','ゴ',
'サ','シ','ス','セ','ソ',
'ザ','ジ','ズ','ゼ','ゾ',
'タ','チ','ツ','テ','ト',
'ダ','ヂ','ヅ','デ','ド',
'ナ','ニ','ヌ','ネ','ノ',
'ハ','ヒ','フ','ヘ','ホ',
'バ','ビ','ブ','ベ','ボ',
'パ','ピ','プ','ペ','ポ',
'マ','ミ','ム','メ','モ',
'ヤ','ユ','ヨ',
'ャ','ュ','ョ',
'ラ','リ','ル','レ','ロ',
'ワ','ヲ','ン','ッ','ヴ');
arrStrRoma :array [0..80] of String = (
'a','i','u','e','o',
'la','li','lu','le','lo',
'ka','ki','ku','ke','ko',
'ga','gi','gu','ge','go',
'sa','si','su','se','so',
'za','zi','zu','ze','zo',
'ta','ti','tu','te','to',
'da','di','du','de','do',
'na','ni','nu','ne','no',
'ha','hi','fu','he','ho',
'ba','bi','bu','be','bo',
'pa','pi','pu','pe','po',
'ma','mi','mu','me','mo',
'ya','yu','yo',
'lya','lyu','lyo',
'ra','ri','ru','re','ro',
'wa','wo','nn','ltu','vi');
function StrZen2StrHan(strZen:String):String;
var
Chr : array [0..255] of char;
strTmp :String;
begin
//// ひらかなはそのままでは半角カタカナに変換できないので
//// 一旦カタカナに変換できる文字列をカタカナに変換
Windows.LCMapString(
GetUserDefaultLCID(),
LCMAP_KATAKANA, //変換を指定
PChar(strZen), //変換する文字列
Length(strZen) + 1, //サイズ
chr, //変換結果
Sizeof(chr) //サイズ
);
strTmp := Chr;
//半角に変換できる文字列を半角に変換
Windows.LCMapString(
GetUserDefaultLCID(),
LCMAP_HALFWIDTH,
PChar(strTmp), //変換する文字列
Length(strTmp) + 1, //サイズ
chr, //変換結果
Sizeof(chr) //サイズ
);
Result := Chr;
end;
function StrHan2StrZen(strHan:String):String;
var
Chr : array [0..255] of char;
begin
//半角に変換できる文字列を半角に変換
Windows.LCMapString(
GetUserDefaultLCID(),
LCMAP_FULLWIDTH,
PChar(strHan), //変換する文字列
Length(strHan) + 1, //サイズ
chr, //変換結果
Sizeof(chr) //サイズ
);
Result := Chr;
end;
procedure ExSendKey(s:String);
var
WStr1,WStr2 :WideString;
i,j,Index :Integer;
begin
WStr1 := WideString(StrHan2StrZen(s));//半角を全角に
{カタカナをローマ字に}
WStr2 := '';
for i := 1 to Length(WStr1) do
begin
Index := -1;
for j := 0 to 81 do
begin
if arrStrKana[j] = WStr1[i] then
begin
Index := j;
Break;
end;
end;
if Index = -1 then
begin
WStr2 := WStr2 + WStr1[i];
end else begin
WStr2 := WStr2 + arrStrRoma[index];
end;
end;
s := StrZen2StrHan(String(WStr2));//全角を半角に戻す
for i := 1 to Length(s) do
begin
if s[i] = ' ' then //スペース
begin
keybd_event(VK_CONTROL,0,0,0);
keybd_event(LoByte(VkKeyScan(s[i])),0,0,0);
keybd_event(LoByte(VkKeyScan(s[i])),0,KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
end else begin
keybd_event(LoByte(VkKeyScan(s[i])),0,0,0);
keybd_event(LoByte(VkKeyScan(s[i])),0,KEYEVENTF_KEYUP,0);
end;
end;
end;
****---------------------------------****
Unit2
Edit1 (imSKata)//フリカナ
Edit2 (imHira)//漢字
****---------------------------------****
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = Chr(VK_RETURN) then
begin
Edit2.SetFocus;
if Edit2.Text = '' then
begin
ExSendKey(Edit1.Text);
end;
end;
end;
****---------------------------------****
「どうだ、これでXPもVistaも同じに動くじゃん!」
低レベルな私には原始的なこんなんしか思いつかん!(;_;)
|