한영전환키가 없는 일제 노트북을 구입했습니다.
일본자판이라 사용하지 않는 키가 있어서 고놈을 keydown event때 코드를 보니까
255가 넘어오더라고요..
그래서 키보드 훅킹을 해서 255가 넘어오면 한영전환을 할려고 하는데...
내가 만든 원래프로그램에서는 잘되는데 다른프로그램에서 하면 한영전환결과가
false가 됩니다. 고수님들 이유좀 알려주세요...
아래는 프로그램 소스입니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, imm, tlhelp32 ;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY;
public
{ Public declarations }
function aaa : integer;
end;
var
Form1: TForm1;
FAtom: TAtom;
hangul : boolean = false; //처음은 영어로 세팅.
implementation
{$R *.DFM}
const
id_SnapShot = 255;
procedure TForm1.WMHotKey (var Msg : TWMHotKey);
var
{ hIMC: HIMC;}
// hIMC: integer;
dwSentence : DWORD;
dwConversion : DWORD;
tMode : HIMC;
winname : himc;
b : boolean;
begin
if Msg.HotKey = id_SnapShot then
begin
tMode := ImmGetContext(handle);
winname := aaa;
tMode := ImmGetContext(winname);
getwindow(tmode, GW_HWNDPREV);
//한영전환 처리
hangul := not hangul;
if hangul then
b:=ImmSetConversionStatus(tMode, IME_CMODE_HANGEUL,
IME_CMODE_HANGEUL)
else
b:=ImmSetConversionStatus(tMode, IME_CMODE_ALPHANUMERIC,
IME_CMODE_ALPHANUMERIC);
end;
//처리결과 확인
if b then showmessage('true') //현재는 자기폼일때는 성공하고
else showmessage('false'); // 다른폼일때는 실패합니다.
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FAtom := GlobalAddAtom('hangul');
RegisterHotKey(Form1.Handle,id_SnapShot, 0, 255);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey (Form1.Handle, id_SnapShot);
end;
//현재 커런트한 윈도우의 핸들구하기..
function TForm1.aaa : integer;
var
hw: integer;
TID,
PID,
hIns: DWORD;
acBuf: array[0..259] of char;
Snap: Integer;
Data: TProcessEntry32;
begin
hw := GetForegroundWindow();
if ( hw <> 0 ) then
begin
FillChar( acBuf, 260, #0 );
GetClassName( hw, @acBuf[0], 260 );
TID := GetWindowThreadProcessID( hw, @PID );
Snap:=CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
try
Data.dwSize := SizeOf( Data );
if( Process32First( Snap, Data ) )then
begin
repeat
if ( Data.th32ProcessID = PID ) then
begin
hIns := Data.th32ModuleID;
strCopy( acBuf, Data.szExeFile );
Memo1.Lines.Add(strpas(acBuf) + ';' + inttostr(hw));
GetClassName( hw, @acBuf[0], 260 );
result := hw;
Break;
end;
until not( Process32Next( Snap, Data ) );
end;
finally
Windows.CloseHandle( Snap );
end;
end;
end;
end.