定义当前系统区域设置是RTL还是LTR

时间:2015-11-06 22:49:08

标签: c++ winapi internationalization

我们开发了一个Windows API应用程序,其中有一个带嵌套子菜单的上下文菜单。我们使用多种语言本地化应用程序,包括希伯来语 由于键盘支持对我们来说是必须的,我们需要知道子菜单是应该在右箭头(LTR)还是左箭头(RTL)按键时打开。
我们的开发人员确实使用了here on MSDN所述的TrackPopupMenu()函数,但他需要知道何时才能设置TPM_LAYOUTRTL标志。
所以问题是:如何定义当前系统区域设置是LTR还是RTL来正确处理菜单?

2 个答案:

答案 0 :(得分:4)

我正在回答,因为我们找到了解决方案(并且评论证实我们的方法是正确的) 为了定义当前系统区域设置是RTL还是LTR,我们应该将GetLocaleInfoExLOCALE_IREADINGLAYOUT一起使用。 MSDN如下所述:

  

Windows 7及更高版本:文本的阅读布局。可能的值在下表中定义。

可能的值实际上是:

  • 0 - 从左到右(如英文);
  • 1 - 从右到左(如希伯来语或阿拉伯语);
  • 2 - 从上到下垂直读取,列从右到左,或从左到右读取水平行(如日语);
  • 3 - 从上到下垂直阅读,列从左到右(如蒙古语)。

答案 1 :(得分:0)

我们使用以下内部代码:

bool IsCurrentInputLanguageRTL ( void )
{
  bool ret=false;
auto layout = GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));

  auto lcid=MAKELCID(LOWORD(layout),SORT_DEFAULT);
  LOCALESIGNATURE localesig;

  // Windows XP and higher.
  // Unicode subset bit fields: https://msdn.microsoft.com/en-us/library/windows/desktop/dd374090(v=vs.85).aspx
  // Bit 123: Windows 2000 and later - Layout progress, horizontal from right to left.
  if(GetLocaleInfoW(lcid,LOCALE_FONTSIGNATURE,(LPWSTR)&localesig,sizeof(localesig)/sizeof(WCHAR)) != 0)
    ret = (localesig.lsUsb[3] & 0x08000000)!=0;

  return ret;
}