C# GetKeyboardLayout()检测到子级布局不正确

C# GetKeyboardLayout()检测到子级布局不正确,c#,layout,detection,C#,Layout,Detection,在我的应用程序中,我使用了一段众所周知的代码: int WinThreadProcId = GetWindowThreadProcessId(GetForegroundWindow(), out _ProcessId); IntPtr KeybLayout = GetKeyboardLayout(WinThreadProcId); if (KeybLayout.ToString() == "68748313") { //russian }; if (KeybLayout.ToString()

在我的应用程序中,我使用了一段众所周知的代码:

int WinThreadProcId = GetWindowThreadProcessId(GetForegroundWindow(), out _ProcessId);
IntPtr KeybLayout = GetKeyboardLayout(WinThreadProcId);

if (KeybLayout.ToString() == "68748313")
{ //russian };

if (KeybLayout.ToString() == "67699721")
{ //english };
它适用于95%的应用。但在以下情况下,它不会检测布局: 启动Application1(例如Outlook.exe),然后单击http链接,打开Application2(IE)。在此应用程序2中,布局始终检测为英语


当IE和Outlook独立启动时,此代码在两者中都能正常工作。

这肯定比它的启动方式更能决定您访问哪种网页。我想当你输入这个问题时,西里尔字母键盘布局没有多大用处吧?不要使用IntPtr.ToString(),而是使用ToInt32()。这使得俄语为0x04190419,英语为0x04090409。419和409是LCID。仅使用低位字(&0xffff),高位字对于Dvorak等布局备选方案可能具有不同的值。不幸的是,这不是正确的原因。更改为ToInt32,行为相同(在大多数情况下,我的代码与西里尔语代码页配合良好)。对“进程监视器”的进一步调查显示,在Outlook中单击http链接会生成两个iexplore进程,一个进程有18个线程,另一个进程有22个线程。我的软件检测到其中一个。也许问题出在函数GetForegroundWindow上?我不明白,我怎么能猜出哪个iexplore是正确的,哪个不是。