From 7d1d9133ffefd3caac36bb6fc4050d575928cfaf Mon Sep 17 00:00:00 2001 From: Gilgamesh Athoraya Date: Mon, 1 Apr 2019 20:44:38 +0200 Subject: [PATCH] dont switch ime if not installed, fix #515 --- windows-ime/set-ime.cs | 19 +++++++++++++++++-- windows-ime/set-ime.exe | Bin 6656 -> 6656 bytes 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/windows-ime/set-ime.cs b/windows-ime/set-ime.cs index f20fd6a6..b6ecd751 100644 --- a/windows-ime/set-ime.cs +++ b/windows-ime/set-ime.cs @@ -13,6 +13,7 @@ class C { const uint WM_INPUTLANGCHANGEREQUEST = 0x0050; const int KLF_ACTIVATE = 1; + [DllImport("user32.dll")] static extern uint GetKeyboardLayoutList(int nBuff, [Out] IntPtr [] lpList); [DllImport("user32.dll")] static extern bool GetKeyboardLayoutName(StringBuilder pwszKLID); [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll")] static extern bool PostMessage(IntPtr hhwnd, uint msg, IntPtr wparam, IntPtr lparam); @@ -51,13 +52,27 @@ public static Process Parent(Process process) { return FindPidFromIndexedProcessName(FindIndexedProcessName(process.Id)); } + public static bool IsLayoutAvailable(string layoutId) { + uint nElements = GetKeyboardLayoutList(0, null); + IntPtr[] ids = new IntPtr[nElements]; + GetKeyboardLayoutList(ids.Length, ids); + for (var index = 0; index < ids.Length; index++) { + if (ids[index].ToString("X16").Substring(8).Equals(layoutId)) return true; + } + return false; + } + static int Main(string[] args) { if (args.Length != 1) { Console.WriteLine("usage: set-ime PID"); return 1; } int pid = int.Parse(args[0]); var w = getWindowByPID(pid); if (w == IntPtr.Zero) { w = getWindowByPID(Parent(Process.GetProcessById(pid)).Id); } - var lc = new StringBuilder(); GetKeyboardLayoutName(lc); lc[0] = 'E'; lc[1] = '0'; lc[2] = '9'; lc[3] = '9'; - PostMessage(w, WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, LoadKeyboardLayout(lc.ToString(), KLF_ACTIVATE)); + var lc = new StringBuilder(); + GetKeyboardLayoutName(lc); + lc[0] = 'E'; lc[1] = '0'; lc[2] = '9'; lc[3] = '9'; + string apl_ime = lc.ToString(); + if (IsLayoutAvailable(apl_ime)) + PostMessage(w, WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, LoadKeyboardLayout(apl_ime, KLF_ACTIVATE)); return 0; } } diff --git a/windows-ime/set-ime.exe b/windows-ime/set-ime.exe index c222e956b811daf67b45b50b16bcab2f87d23a64..c6712e816eee89146e826bc92031d75b4703d7bb 100644 GIT binary patch delta 2157 zcmY*bZERCj7=F&Vr?>aswzst1x|V%)4xypUZL%OU5}Dy^fdrO`&iDbF4zpyeY~75A zu0xH2QJ`Kmfk+~TA0Q^iK$IUOO2lu&4-+FM#7K<((D;eQgc$TWr;Q&s>2u!qIq!Mz z`*m(Q*E831V2`?d=gW6ho^Fz}ot0N^^A~giw}a10;DV~OrGhrGMLr%69u>2>t=!bl zI{qX=7;gtoM*u-R3fMv0ysnlOnGXTp;#8MJ9XGg{fZSyP$|~Bygv^$cw2i_kg=zPQ z-hj+Il#8wgkC0M@r3qD}Z*MwIA0F%?-{6Hi;?7k&#q%Yf5Gf!$8zY~$sVxMLkoHoc zM5yEKFPjr;Cc(ogJ7L#d6^3;ZcJW$z^l%Z5392}cTDq(1rx2}@>0%-%SoxTVis5>m zolgZ@t@HvaBG0_Mg0K;tVyZi)>IqJX$ha9oIyhvlFKgAai)k)nCOaMMVx+nR$gz65 zEX4+H>s>p~+-A6* zZm~Fq!6j8#F+{$77C6WCXDts-PmN97Ut%UW#iBpXwSDs-mNQgV676d@_pjo*j{1(E zKeVVrw~GhCNd-p_%oJ_>F$cpjGjj#lCfzQLPti;Nz2;wpOf19Df?^1&oRT7Cv{4 zwtNBOVu&+%z-SfBin|%^aJ$}nBJ-HI*EB$vU2FIMqrE5gitXT)<744HaYB?!;N7aJ zZ;D6Ih)p@ISKTyWsH&mg+76C0D{xjw_Vj(WQQ(R}i#3&Si56l+g*sw&SEA9#ZA6JB zL<`-9S+21Rv*0E}Z8Uhh!L0^Ii4x;RE*ZIc_+Qz=gX9&orNHk0S@uHLqL26(`i(q5 z+ymFhQQTvd5Al<%joL6`9VPCyUcneXwqC;|zOYVVCoWs3u^U32A!DnzuosQ$UY=@K zr->cv9iCdIE)dtKi#UjF>T4XK&+mwH>KF1=4^Jsy97Lc}#KS5hj^kCeuq-NgLlwks zoKamOYeLE51GP-Jc#2M6H;l{tVjLoey}ORxTqCYyqc$?Dh^WU)_z=HC3Rg6Xn}o2Q zV<9Z;Vl^N_IAPW>&YIQ5XJ(Dyl3BAc{6;~|v9Gh*KM~cH! z_iY&7S)7^PFjkrl&bt>A{iQ0=_rUPj`0&X1XmH$H6`iD;&5y0h!#>eA>`8E-Frx+Z?Q4Oj*~j{{e%Qe!G?6fek{c=(psp1Vn-eirkU zuyJiVojgF1^KimavZKCU<}K2eREI`fvvw`n{n5GT{mkg$N4Tb_LN!^sqnxMJFDui9MA)kGF;f+<^E@XXgfFV} zOcIe#QPV0M_yfFm<3KIJ9b~htn0(=u>JUhCEDYpW3KTtU zb@J@p@mk@ufIc?9qz~sqpRxWr7SF_ODGc=Rs(c-TP#1e-FMVYCP(EX>%G2Gcs>~x> zq%K{F%P_s}B+t=0_dNH=C#8{XIAkYY-0<}BF+80 zEIK*F%?9Vodg7hw!&vk04axg^naL8yrS334PgK`2#NW=D}T zot4=s%)E!4!)(Uh^_;*1aPdY?^Ac|2QB^-ayOA$wo zzg!)-Ms%YZKNf=rl)gIX#AKcafGOFjA&up=(SbiYa^dF@;RcyMWeZV4_-C$?*?xfyiJsl zoVP$!qDWE>BdN#=amp67t3cgdS7V)rwc>RwB=%wnahTtxmVKnu7*WfOs8jC~=c^CV zhY@uc{TNe6un9-hF>Jwc^#wI2)i`#bcv0!#D>V4{MV(;Sb#uR z!!zF1@UyBX!WMsBxX&L8C#xF9>ti2?@KU_pT~#RmtV2;f5N@k(Zs{2