YIME
YIME copied to clipboard
UWP 下无法加载 Yime.Core.dll?
哈喽,这个项目挺有意思,正好我也有用C#实现TSF接口的需求,所以就在你的代码基础上试验了一下:
我把Yime.Core
里面CompositionManager
和CandidateManager
里面的NotImplementedException
都去掉,然后加入一些简单的逻辑(回车、空格就commit,其他键就吞键),可以运行得起来。
有一个小坑是需要把部署程序(Yime.exe)分别用x86和x64编译和运行,才有办法同时注册到 Computer\HKEY_CLASSES_ROOT\WOW6432Node\CLSID
和 Computer\HKEY_CLASSES_ROOT\CLSID
底下。
测试了一下,32 位 (SysWOW64/notepad.exe
) 和64位 (System32/notepad.exe
)的记事本,以及其他大部分程序都可以正常激活输入法功能(即可以吞键)。但是UWP app(Edge,Onenote等等)都不行,虽然输入法状态栏显示切换到了Yime,但是实际上还是前一个输入法在启用。
另外,PlayGround如果用VS调试器运行,当Yime被激活的时候(虽然PlayGround本身没有用到Yime.Core),Yime.Core的断点也可以调试到。但是我创建了一个UWP 版的Playground(就只有一个TextBox),切换到Yime之后就调试器就没有激活断点。现在不知道这是调试器的问题还是UWP环境底下就无法载入Yime.Core。
不知道有没有什么解决思路?提前表示感谢。
应该可以确定是在UWP应用内,输入法的DLL(C#)没被加载。具体原因猜测和.NET loader有关,还在研究。
用 WinDbg,看到打开非UWP进程,激活输入法的时候,先载入了mscoree.dll
, mscoreei.dll
等等.NET框架的东西,然后载入了.NET DLL (YngPing.TSF.dll
是我修改过的Yime.Core.dll
,以及TSF.TypeLib.dll
)。
而在 UWP App 下切换输入法的时候,mscoree.dll
, mscoreei.dll
载入之后就结束了。(后面.NET DLL没被载入)
我一度觉得是不是因为.NET Framework运行在UWP的Container里面,没有dll所在目录的读写权限。但是把.NET DLL 放到 System32
和 SysWOW64
下面之后,问题依旧。
我有空会看一下,UWP我还是不够了解。谢谢关注
在 2018年6月2日週六 20:45,Radium [email protected] 寫道:
用 WinDbg,看到打开非UWP进程,激活输入法的时候,先载入了mscoree.dll, mscoreei.dll等等.NET http://xn--dxza.net框架的东西,然后载入了.NET http://xn--ykqu3em0c9y0clw5a.net DLL (YngPing.TSF.dll是我修改过的Yime.Core.dll,以及TSF.TypeLib.dll)。
[image: image] https://user-images.githubusercontent.com/2714446/40874692-e102915c-66b5-11e8-8adc-0633175e8fae.png
而在 UWP App 下切换输入法的时候,mscoree.dll, mscoreei.dll载入之后就结束了。(后面.NET http://xn--fqru08m.net DLL没被载入)
[image: image] https://user-images.githubusercontent.com/2714446/40874728-60c395ee-66b6-11e8-9df9-dffc8ecb05a9.png
我一度觉得是不是因为.NET http://xn--4gq0a1j476aixjlmbz9h97jba0522g.net Framework运行在UWP的Container里面,没有dll所在目录的读写权限。但是把.NET http://xn--gqqp38b7tc.net DLL 放到 System32 和 SysWOW64 下面之后,问题依旧。
— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/copyliu/YIME/issues/2#issuecomment-394084955, or mute the thread https://github.com/notifications/unsubscribe-auth/ABBtoMJlOctV-AI4I9CVofXj5T9GOo3Nks5t4ojigaJpZM4UXpXF .
小 Update 一下:
我一度想試試看把 ITfTextInputProcessorEx
實現爲 out-of-process COM Server,這樣就可以繞開和UWP運行在同一進程帶來的問題。但是發現 TSF 在創建 COM Object 的時候傳遞給 CoCreateInstance 的參數 dwClsContext = 1 (即 CLSCTX_INPROC_SERVER
),那麼意味着只能用 in-process 的方式實現,LocalServer不會被TSF使用。
(圖爲我在
combase.dll!CoCreateInstance
設的斷點)
雖然我對UWP了解不多, 但是按照之前微軟的吹法, 不應該能out-of-process, 甚至懷疑不應該用COM方式去實現.
On Sat, Jun 9, 2018 at 8:21 PM Radium [email protected] wrote:
小 Update 一下:
我一度想試試看把 ITfTextInputProcessorEx 實現 out-of-process COM Server,這樣就可以繞開和UWP運行在同一進程帶來的問題。但是發現 TSF 在創建 COM Object 的時候傳遞給 CoCreateInstance 的參數 dwClsContext = 1 (即 CLSCTX_INPROC_SERVER),那麼意味着只能用 in-process 的方式實現。
[image: image] https://user-images.githubusercontent.com/2714446/41191470-60f9b246-6c33-11e8-964a-d0962e7cd501.png (圖爲我在combase.dll!CoCreateInstance設的斷點)
— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/copyliu/YIME/issues/2#issuecomment-395965204, or mute the thread https://github.com/notifications/unsubscribe-auth/ABBtoFDDNPKnftHbvhPAiB6am8hUfyHNks5t673NgaJpZM4UXpXF .
-- My GPG public key : 0x3B05080A52EF063E
按照之前微軟的吹法, 不應該能out-of-process
嗯,大概不然就破壞了AppContainer的安全機制。
懷疑不應該用COM方式去實現
所以用 WinRT 的 API 麼? https://docs.microsoft.com/en-us/uwp/api/windows.ui.text.core 但這個似乎只有取用Text Service,不能提供Text Service。
@ztl8702 可以提供你的demo我学习一下吗?
@lantianning
yngping-new-ui-e99249552c8159f6199b5d3c1226e50223afa97d.zip 主要代码在YngPing.TSF
下。
我有在 StackOverflow 上面问了一下,但没有满意的解答(都是说不可以,但是没有说具体的技术细节)。
@copyliu @ztl8702 我发现输入法不分字母大小写,内部处理都是当作大写处理的?这是什么原因?为了验证,我在CompositionManager的OnKeyDown回调函数中做了个_textService._ipcClient.SendRequest()作为LOG,结果发现不管CapsLock是否锁定,wParam的值都是大写字母的值。是不是哪里出了问题?
参考代码如下: public HRESULT OnKeyDown(ITfContext pic, UIntPtr wParam, IntPtr lParam, out bool pfEaten) { //throw new NotImplementedException(); _textService._ipcClient.SendRequest($"wParam: {(uint)wParam} lParam: {(uint)lParam}"); if (ProcessKeyStroke(pic, (uint)wParam)) { pfEaten = true; } else { pfEaten = false; }
//_textService._candidateManager.ShowWindow();
return new HRESULT { Code = 0 };
}
按照之前微軟的吹法, 不應該能out-of-process
嗯,大概不然就破壞了AppContainer的安全機制。
懷疑不應該用COM方式去實現
所以用 WinRT 的 API 麼? https://docs.microsoft.com/en-us/uwp/api/windows.ui.text.core 但這個似乎只有取用Text Service,不能提供Text Service。
您好,感谢您的分享,最近也在弄这块,我看了您源码很受益,测试的时候也发现了问题,就是在浏览器和记事本等均没有反应,我的系统是win10的。希望楼主指点一二
@lantianning yngping-new-ui-e99249552c8159f6199b5d3c1226e50223afa97d.zip 主要代码在
YngPing.TSF
下。
您好,感谢您的分享,最近也在弄这块,我看了您源码很受益,测试的时候也发现了问题,就是在浏览器和记事本等均没有反应,我的系统是win10的。希望楼主指点一二