ðŽ IMEã®åèãªã³ã¯
TSF ããã¹ã ãµãŒãã¹ã¯å€èšèªãµããŒããæäŸããããŒããŒã ããã»ããµãææžãèªèãé³å£°èªèãªã©ã®ããã¹ã ãµãŒãã¹ãæäŸããŸãã
TSF ã¯ãäžé£ã® COM ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠããã®ãã¬ãŒã ã¯ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ãšããã¹ã ãµãŒãã¹ã«å ¬éããŸãã
ããšãã°ãããã¹ã ãµãŒãã¹ã§ã¯ãé³å£°ãŸãã¯ææžãå ¥åããã€ã¹ããã®ããã¹ãå ¥åãæäŸã§ããŸãã
IMEã ãã§ãªãïŒé³å£°å ¥åïŒææžãå ¥åã®ããã¹ããµãŒãã¹ããããããïŒ
ããã¹ã ãµãŒãã¹ã¯ãTSF 察å¿ã¢ããªã±ãŒã·ã§ã³ããããã¹ããååŸããããã¹ããæäŸããŸãã
TSF ã䜿çšãããšãããã¹ã ãµãŒãã¹ã¯ãããã¥ã¡ã³ã ãããã¡ãŒã«ç¶ç¶çã«ã¢ã¯ã»ã¹ããŠãæ£ç¢ºã§å®å šãªããã¹ã倿ãæäŸã§ããŸãã TSF ã䜿çšããããã¹ã ãµãŒãã¹ã§ã¯ãæ©èœãå ¥åã¢ãŒããšç·šéã¢ãŒãã«åé¢ããããšãåé¿ã§ããŸãã ãã®å ¥åã¢ãŒããã¯ãã£ã«ããããããã¡ãŒã«æ ŒçŽãããããã¹ã ã¹ããªãŒã ãåçã«å€æŽã§ãããããããŒããŒãå ¥åãšããã¹ãç·šéãããå¹ççã«è¡ãããšãã§ããŸãã
å ¥åã¢ãŒããšç·šéã¢ãŒããåé¢ããã«äœ¿çšã§ãããšã¯ã©ãããããšã ããã?
Text Services Framework ã«ã¯ã次㮠3 ã€ã®äž»èŠã³ã³ããŒãã³ããå«ãŸããŠããŸãã
- ã¢ããªã±ãŒã·ã§ã³
- ããã¹ããµãŒãã¹
- TSFãããŒãžã£ãŒ
ã¢ããªã±ãŒã·ã§ã³ãã¯ã©ã€ã¢ã³ãã§ïŒããã¹ããµãŒãã¹ããµãŒããŒïŒãã®ä»²ä»ãè¡ããTSFãããŒãžã£ãŒã¿ãããªæã...?
ã¢ããªã±ãŒã·ã§ã³ã¯ããã¹ãã衚瀺ïŒç·šéïŒä¿åããæäœãè¡ã
ã¢ããªã±ãŒã·ã§ã³ã¯ãç¹å®ã®ã€ã³ã¿ãŒãã§ãŒã¹ããµããŒãããTSF ãããŒãžã£ãŒãå ¬éããã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšã㊠TSF ãšéä¿¡ãã COM ãµãŒããŒãå®è£ ããããšã«ãã£ãŠãããã¹ããžã®ã¢ã¯ã»ã¹ãæäŸããŸãã
ã©ãããããšã ãã...?
ããã¹ã ãµãŒãã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã¹ã ãããã€ããŒ
ããã¹ã ãµãŒãã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ããããã¹ããååŸããã¢ããªã±ãŒã·ã§ã³ã«ããã¹ããæžã蟌ã
ããã¹ã ãµãŒãã¹ã¯ãããèªäœã TSF ã«ç»é²ãã COM ã€ã³ããã»ã¹ ãµãŒããŒãšããŠå®è£ ãããŸãã
...?
ããã¹ã ãµãŒãã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ãšçŽæ¥ããåãããããšã¯ãããŸããã ãã¹ãŠã®é信㯠TSF ãããŒãžã£ãŒãééããŸãã TSF ãããŒãžã£ãŒã¯ãªãã¬ãŒãã£ã³ã°ã»ã·ã¹ãã ã«ãã£ãŠå®è£ ãããŠããã眮ãæããããšã¯ã§ããŸããã
TSFãããŒãžã£ãŒã¯OSã®æ©èœ
ãã®ã¢ãŒããã¯ãã£ã§ã¯ãTSF ãããŒãžã£ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãšããã¹ã ãµãŒãã¹ã®éã«æœè±¡åã¬ã€ã€ãŒãæäŸããŸãã ãã®æœè±¡åã¬ã€ã€ãŒã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ãš 1 ã€ä»¥äžã®ããã¹ã ãµãŒãã¹ã§ããã¹ããå ±æã§ããTSF ãããŒãžã£ãŒã¯ããã¹ã ãµãŒãã¹ã管çã§ããŸãã
TSFãããŒãžã£ãŒãã¢ããªã±ãŒã·ã§ã³ãšããã¹ããµãŒãã¹ã®éã«å ¥ã£ãŠïŒæœè±¡åã¬ã€ã€ãŒãæäŸããŠããããããã§ïŒããã¹ããå ±æã§ããããã
TSF ãæ£ããã€ã³ã¹ããŒã«ãããå®è¡ãããŠããããšã確èªããã«ã¯ãCRTL + Alt + DELETE ããŒãæŒããŠã[ ã¿ã¹ã¯ ãããŒãžã£ãŒ] ãã¯ãªãã¯ããŸãã [ ããã»ã¹ ] ã¿ãã§ãctfmon.exe ããã»ã¹ãå®è¡ãããŠããå¿ èŠããããŸãã
ã¿ã¹ã¯ãããŒãžã£ãŒã確èªããŠã¿ããšïŒãCTFããŒããŒããšããååã®ããã»ã¹ã®å®è¡ãã¡ã€ã«ãctfmon.exeã ã£ãïŒ
éåžžãIME ãšããã¹ã ãµãŒãã¹ (Text Services Framework ã«åºã¥ã) ã¯ãã€ããã㯠ãªã³ã¯ ã©ã€ãã©ãª (DLL) ãšããŠå®è£ ããã
ããã¹ã ãµãŒãã¹ã¯ãDLL ã§å ¬éãããã³ã³ããŒãã³ã ãªããžã§ã¯ã ã¢ãã« (COM) ãªããžã§ã¯ããšããŠå®è£ ãããŸãã
ctfmon.exe ããã»ã¹ã¯ããã¹ã¯ãããäžã® Text Services Framework ã管çããèšèªããŒã®ãŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ (UI) ãæäŸããŸãã
ã³ã³ãã€ã«ããæºåãã§ããŠãããµã³ãã« TSF ã¢ããªã±ãŒã·ã§ã³ãšããã¹ã ãµãŒãã¹ã¯ãMicrosoft Platform Software Development Kit (SDK) ãµã³ãã« ãã©ã«ããŒå ã® winui ãã©ã«ããŒã«ãããŸãã
å ±éèŠçŽ ãšããã®ã¯ïŒããã¹ããµãŒãã¹ãšã¢ããªã±ãŒã·ã§ã³ã®äž¡æ¹ã§å ±éããŠäœ¿çšã§ããèŠçŽ ã®ããšïŒ
ã¹ã¬ããã»ãããŒãžã£ãŒã¯ãTSF ãããŒãžã£ãŒã®åºæ¬ã³ã³ããŒãã³ã
ã¹ã¬ãã ãããŒãžã£ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ãšããã¹ã ãµãŒãã¹ (ã¯ã©ã€ã¢ã³ã) ã®äž¡æ¹ã«é¢é£ããäžè¬çãªã¿ã¹ã¯ãå®è¡
ããã¹ããµãŒãã¹ãã¯ã©ã€ã¢ã³ãåŽ???
ã¯ã©ã€ã¢ã³ãã¯ïŒã¢ããªã±ãŒã·ã§ã³ãšããã¹ããµãŒãã¹ã®äž¡æ¹ãšããããšããªïŒ
ãã®ãšãïŒãµãŒããŒåŽã¯ã¹ã¬ãããããŒãžã£ãŒ
TSF ãããŒãžã£ãŒã«ãã£ãŠæäŸãããã€ã³ã¿ãŒãã§ã€ã¹ãšãªããžã§ã¯ãã®å€§éšåã¯ãã¹ã¬ãã ãããŒãžã£ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããã¡ãœããã䜿çšããŠååŸã§ããŸãã
ã¹ã¬ãããããŒãžã£ãŒããã¢ã¯ã»ã¹ããïŒãšããããšã¯ã¹ã¬ãããããŒãžã£ãŒã¯ãšãŠã倧äº
ã¢ããªã±ãŒã·ã§ã³ã¯ãCLSID_TFThreadMgrã§ CoCreateInstance ãåŒã³åºããŠã¹ã¬ãã ãããŒãžã£ãŒ ãªããžã§ã¯ããäœæããŸãã
ããã¹ã ãµãŒãã¹ã¯ãããã¹ã ãµãŒãã¹ ITfTextInputProcessor::Activate ã¡ãœããã§ã¹ã¬ãã ãããŒãžã£ãŒ ãªããžã§ã¯ããååŸããŸãã
ã¢ããªã±ãŒã·ã§ã³ãã¹ã¬ãããããŒãžã£ãŒãäœæããŠïŒããã¹ããµãŒãã¹ãã¹ã¬ãããããŒãžã£ãŒãååŸãã
ã¹ã¬ãã ãããŒãžã£ãŒã¯ãã¯ã©ã€ã¢ã³ãã«ãã€ãã³ãéç¥ãæäŸããŸãã
ã¹ã¬ãã ãããŒãžã£ãŒããéç¥ãåãåãããã«ãã¯ã©ã€ã¢ã³ã㯠ITfThreadMgrEventSink ãªããžã§ã¯ããå®è£ ããã€ãã³ã ã·ã³ã¯ãã€ã³ã¹ããŒã«ããŸãã
ã¹ã¬ãããããŒãžã£ãŒã¯ã¯ã©ã€ã¢ã³ã(ããã¹ããµãŒãã¹ãã¢ããªã±ãŒã·ã§ã³)ã«ã€ãã³ããéç¥ããïŒ
ã¯ã©ã€ã¢ã³ãã¯ã€ãã³ãéç¥ãåãåãããã«ïŒã€ãã³ãã·ã³ã¯ãã€ã³ã¹ããŒã«ããïŒ
ããã¥ã¡ã³ã ãããŒãžã£ãŒ ãªããžã§ã¯ããäœæããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã ITfThreadMgr::CreateDocumentMgr ãåŒã³åºããŸãã
ã¹ã¬ãããããŒãžã£ãŒããïŒããã¥ã¡ã³ããããŒãžã£ãŒãäœã£ãŠãã
ã¢ããªã±ãŒã·ã§ã³ã¯ãã¢ããªã±ãŒã·ã§ã³ã管çããåã ã®ããã¥ã¡ã³ãããšã«åå¥ã®ããã¥ã¡ã³ã ãããŒãžã£ãŒ ãªããžã§ã¯ããäœæããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯ç®¡çããŠããããã¥ã¡ã³ãã®æ°ã ãããã¥ã¡ã³ããããŒãžã£ãŒãæã€
ããã¥ã¡ã³ã ãããŒãžã£ãŒã䜿çšããŠç·šéã³ã³ããã¹ããäœæããã³ã³ããã¹ã ã¹ã¿ãã¯ã«ã³ã³ããã¹ãã远å ããã³ã³ããã¹ã ã¹ã¿ãã¯ããã³ã³ããã¹ããåé€ããŸãã
ããã¥ã¡ã³ããããŒãžã£ãŒã䜿ã£ãŠïŒã³ã³ããã¹ãã¹ã¿ãã¯ã«ïŒãä»ç·šéããŠããããã¥ã¡ã³ãã¯ããã§ã!ããšããã³ã³ããã¹ãã远å ããæãããª...?
ããã¹ã ãµãŒãã¹ã¯ ITfThreadMgr::GetFocus ãåŒã³åºããŠãçŸåšã¢ã¯ãã£ããªããã¥ã¡ã³ã ãããŒãžã£ãŒ ãªããžã§ã¯ããååŸããŸãã ããã¹ã ãµãŒãã¹ã§ã¯ãããã¥ã¡ã³ã ãããŒãžã£ãŒã䜿çšããŠãã¹ã¿ãã¯ã®äžéšã«ããã³ã³ããã¹ããååŸããŸãã
ããã¹ããµãŒãã¹ã¯ã¢ã¯ãã£ããªããã¥ã¡ã³ããããŒãžã£ãŒã䜿çšããŠã³ã³ããã¹ãã¹ã¿ãã¯ã®äžéšã®ã³ã³ããã¹ããååŸãã
ããã¹ããµãŒãã¹ã¯ïŒååŸããã³ã³ããã¹ããå
ã«è²ã
ããã®ã ãã
ã³ã³ããã¹ãã«ãã£ãŠïŒããã¹ããµãŒãã¹ã¯ïŒä»ã©ã®ãããªç¶æ ãªã®ãããããïŒ
ããã¹ã ãµãŒãã¹ã§ã¯ãããã¥ã¡ã³ã ãããŒãžã£ãŒã䜿çšããŠç¬èªã®ã³ã³ããã¹ããäœæããã³ã³ããã¹ã ã¹ã¿ãã¯ã«è¿œå ããŠåé€ããããšãã§ããŸãã ããã¯éåžžããŠãŒã¶ãŒãåèªãéžæã§ããããã«åèªã®ãªã¹ãã衚瀺ãããå Žåãªã©ãããã¹ã ãµãŒãã¹ã§ã¢ãŒãã« ãŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ã衚瀺ããå¿ èŠãããå Žåã«è¡ãããŸãã ãªã¹ãã衚瀺ããããšãããã¹ã ãµãŒãã¹ã¯ç¬èªã®ã³ã³ããã¹ããã¹ã¿ãã¯ã«é 眮ããŸãã åèªãªã¹ããéãããšãããã¹ã ãµãŒãã¹ã¯ãã®ã³ã³ããã¹ããã¹ã¿ãã¯ããåé€ããŸãã
ããã¹ããµãŒãã¹ãäœæããã³ã³ããã¹ããšããŠïŒ[åèªéžæãªã¹ãã®è¡šç€º]ãããïŒ
ãªã¹ãã衚瀺ããããšïŒã³ã³ããã¹ããã³ã³ããã¹ãã¹ã¿ãã¯ã«è¿œå ããŠïŒãªã¹ããéãããããšã³ã³ããã¹ãã¹ã¿ãã¯ããåé€ããïŒ
[åèªéžæãªã¹ã衚瀺äž]ãšæžãããçŽ(ã³ã³ããã¹ã)ãïŒçŽæ(ã³ã³ããã¹ãã¹ã¿ãã¯)ã®äžçªäžã«è¡šç€ºãããŠããå§¿ãæ³åãããïŒ
ç·šéã³ã³ããã¹ããäœæããããã«ãã¢ããªã±ãŒã·ã§ã³ã¯ ITfDocumentMgr::CreateContext ãåŒã³åºããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯ïŒãä»ïŒããã¥ã¡ã³ããç·šéäžã§ãããšããã³ã³ããã¹ããïŒããã¥ã¡ã³ããããŒãžã£ãŒã䜿ã£ãŠäœæãã
çŸåšã¢ã¯ãã£ããªç·šéã³ã³ããã¹ãã¯ãäœæ¥äžã®ããã¥ã¡ã³ã ãããŒãžã£ãŒã®ã¹ã¿ãã¯ã®äžéšã«ããç·šéã³ã³ããã¹ãã§ãã
ããã¥ã¡ã³ããããŒãžã£ãŒãã³ã³ããã¹ãã¹ã¿ãã¯ãæã£ãŠããã®ã
âã«ãåãããšãæžãããŠãã
çŸåšã¢ã¯ãã£ããªã³ã³ããã¹ããååŸããããã«ãããã¹ã ãµãŒãã¹ã¯ ITfThreadMgr::GetFocus ãåŒã³åºããŠã¢ã¯ãã£ããªããã¥ã¡ã³ã ãããŒãžã£ãŒãååŸã ãITfDocumentMgr::GetTop ãåŒã³åºããŠã¹ã¿ãã¯ã®äžéšã«ããç·šéã³ã³ããã¹ããååŸããŸãã
ã¹ã¬ãããããŒãžã£ãŒ -> ããã¥ã¡ã³ããããŒãžã£ãŒ -> ç·šéã³ã³ããã¹ã ã®é çªã§ååŸãã
IMEãäœããµã³ãã«
ç·šéCookie
ç·šéã³ã³ããã¹ãã¯ãèªã¿åãå°çšãŸãã¯èªã¿åã/æžã蟌ã¿ããã¥ã¡ã³ã ããã¯ãæã€
TSFã®ã¡ãœããã䜿ããšãã«ãç·šéã³ã³ããã¹ãã®ããã¥ã¡ã³ãããã¯ãèå¥ããªããšãããªã
ããã¥ã¡ã³ã ããã¯ã¯ãTSF ãããŒãžã£ãŒãšã¢ããªã±ãŒã·ã§ã³ã®éã®ããŽã·ãšãŒã·ã§ã³ã«ãã£ãŠååŸããã
ããã¹ããµãŒãã¹ã¯ããŽã·ãšãŒã·ã§ã³ãçŽæ¥å®è¡ã§ããªã
ããã¹ããµãŒãã¹ã¯ã³ã³ããã¹ããšç·šéã»ãã·ã§ã³ãèŠæ±ããŠãããã¥ã¡ã³ãããã¯ãååŸãã
ç·šéã»ãã·ã§ã³ãèš±å¯ããããšãããã¹ããµãŒãã¹ã«ç·šéCookieãæäŸããã
ç·šéCookieãã¡ãœããã«æž¡ããŠãç·šéã³ã³ããã¹ããèå¥ãã
ðŠ Rustã®windowsã¯ã¬ãŒã
ðŠ Rustã®windowsã¯ã¬ãŒã
tsfpad-step1 ã§éã¶
WM_IME_COMPOSITION ã®åŠçãã³ã¡ã³ãã¢ãŠãããŠãåé¡ãªãïŒ
InsertTextAtSelectionã¯æ¥æ¬èªå
¥åãéå§ãããšãã«åŒã°ããïŒ
SetTextã¯ããŒå
¥åããšã«åŒã°ãïŒãŠã£ã³ããŠã«è¡šç€ºãããŠããããã¹ããšã®å·®åã®æååãåŒæ°ã®pchTextã«æ ŒçŽãããŠããïŒ
SetSelectionã¯ã«ãŒãœã«ãç§»åããããšã«åŒã°ãïŒã«ãŒãœã«äœçœ®ã瀺ãïŒ
ã³ãã³ãã©ã€ã³ã§åãåã£ãåŒæ°ã«å¯Ÿãã 倿ãªã¹ãã衚瀺ããããã°ã©ã