none
C# и .NET Culture is not supported. Parameter name: culture 0 (0x0000) is an invalid culture identifier. RRS feed

  • Вопрос

  • Culture is not supported. Parameter name: culture 0 (0x0000) is an invalid culture identifier. 
    Пытаюсь написать свою панель. которая будет содержать только нужные мне кнопки и информацию. Сейчас пытаюсь реализовать кнопку для смены языка в активном окне (в окне чужого процесса). Для получения ID процесса активного окна использую Таймер.
    private void timer_lang_Tick(object sender, EventArgs e)
            {
                label1.Text = "x = " + Cursor.Position.X;
                label2.Text = "y = " + Cursor.Position.Y;
                if (Cursor.Position.Y < 1)
                {
                    //TopLevel = true;
                    //Activate();
                    Show();
                }
                lbl_Time.Text = FormatTime(":", true);
                
                // получаем хендел активного окна
                IntPtr hfWnd = GetForegroundWindow();
                if (hfWnd != ThisPrcss)
                {
                    uint activepid;
                    uint thispid;
                    //получаем id процесса активного окна
                    GetWindowThreadProcessId(hfWnd, out activepid);
                    GetWindowThreadProcessId(ThisPrcss, out thispid);
                    if (activepid != thispid)
                    {
                        ActivPrcss = hfWnd;
                        using (Process p = Process.GetProcessById((int)activepid))
                        {
                            IntPtr pId = GetKeyboardLayout((uint)p.Id);
                            if (pId == IntPtr.Zero)
                            {
                                foreach (ProcessThread pt in p.Threads)
                                {
                                    pId = GetKeyboardLayout((uint)pt.Id);
                                    if (pId.ToInt32() > 0)
                                        break;
                                }
                            }
                            hfWnd = IntPtr.Zero;
                            if (pId == EngHandl)
                            {
                                if (CurCulture.Contains("ru"))
                                {
                                    CurCulture = "en";
                                    btn_globalisation.Text = "EN";
                                    btn_globalisation.Image = Properties.Resources.США;
                                }
                            }
                            else
                            {
                                if (CurCulture.Contains("en"))
                                {
                                    CurCulture = "ru";
                                    btn_globalisation.Text = "RU";
                                    btn_globalisation.Image = Properties.Resources.Россия;
                                }
                            }
                        }
                    }
                    else
                    {
                        //if (!InputLanguage.CurrentInputLanguage.Culture.Name.Contains(CurCulture))
                        //{
                        if (btn_globalisation.Text != "RU")
                        {
                            if (CurCulture.Contains("ru"))
                            {
                                //InputLanguage.CurrentInputLanguage = RUS;
                                btn_globalisation.Text = "RU";
                                btn_globalisation.Image = Properties.Resources.Россия;
                            }
                        }
                        else
                        {
                            if (CurCulture.Contains("en"))
                            {
                                //InputLanguage.CurrentInputLanguage = ENG;
                                btn_globalisation.Text = "EN";
                                btn_globalisation.Image = Properties.Resources.США;
                            }
                        }
                        //}
                    }
                }
                else
                {
                    //if (!InputLanguage.CurrentInputLanguage.Culture.Name.Contains(CurCulture))
                    //{
                    if (btn_globalisation.Text != "RU")
                    {
                        if (CurCulture.Contains("ru"))
                        {
                            //InputLanguage.CurrentInputLanguage = RUS;
                            btn_globalisation.Text = "RU";
                            btn_globalisation.Image = Properties.Resources.Россия;
                        }
                    }
                    else
                    {
                        if (CurCulture.Contains("en"))
                        {
                            //InputLanguage.CurrentInputLanguage = ENG;
                            btn_globalisation.Text = "EN";
                            btn_globalisation.Image = Properties.Resources.США;
                        }
                    }
                    //}
                }
                //label2.Text = ActivPrcss.ToString();
                //label3.Text = ThisPrcss.ToString();
            }
    после чего на панели по нажатию кнопки смены раскладки должна меняться раскладка для процесса, чей ID был запомнен, т.е. для последнего активного окна. 
    private void btn_globalisation_Click(object sender, EventArgs e)
            {
                if (ActivPrcss != IntPtr.Zero)
                {
                    IntPtr CurPtr;
                    uint activepid;
                    uint thispid;
                    //получаем id процесса активного окна
                    GetWindowThreadProcessId(ActivPrcss, out activepid);
                    GetWindowThreadProcessId(ThisPrcss, out thispid);
                    if (activepid != thispid)
                    {
                        if (!CurCulture.Contains("ru"))
                        {
                            CurCulture = "ru";
                            //InputLanguage.CurrentInputLanguage = RUS;
                            btn_globalisation.Text = "RU";
                            btn_globalisation.Image = Properties.Resources.Россия;
                            //SendMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, RLayout); аправпрfdghfgh
                            //PostMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, LoadKeyboardLayout(LANG_RUS.ToString(), 1));
                            //CurPtr = PostMessage(ActivPrcss, LANG_RUS, IntPtr.Zero, IntPtr.Zero);
                            CurPtr = PostMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, new IntPtr(INPUTLANGCHANGE_FORWARD), IntPtr.Zero);
                            //CurPtr = PostMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, new IntPtr(INPUTLANGCHANGE_FORWARD), ActivateKeyboardLayout(LANG_RUS, 0));
                            //CurPtr = PostMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, ActivateKeyboardLayout(LANG_RUS, 0));
                            //ChangeRemoteWndKeyboardLayoutToRussian(ActivPrcss);
                            
                        }
                        else
                        {
                            CurCulture = "en";
                            //InputLanguage.CurrentInputLanguage = ENG;
                            btn_globalisation.Text = "EN";
                            btn_globalisation.Image = Properties.Resources.США;
                            //SendMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, ELayout);
                            //PostMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, LoadKeyboardLayout(LANG_ENG.ToString(), 1));
                            //CurPtr = PostMessage(ActivPrcss, LANG_ENG, IntPtr.Zero, IntPtr.Zero);
                            CurPtr = PostMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, new IntPtr(INPUTLANGCHANGE_FORWARD), IntPtr.Zero);
                            //CurPtr = PostMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, new IntPtr(INPUTLANGCHANGE_FORWARD), ActivateKeyboardLayout(LANG_ENG, 0));
                            //CurPtr = PostMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, ActivateKeyboardLayout(LANG_ENG, 0));
                            //ChangeRemoteWndKeyboardLayoutToEnglish(ActivPrcss);
                        }
                        //SendMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, CLayout);
                        //CurPtr = PostMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, new IntPtr(INPUTLANGCHANGE_FORWARD), ActivateKeyboardLayout(LANG_RUS, 0));
                        //label1.Text = CurPtr.ToString();
                        //if (CurPtr == IntPtr.Zero)
                        //{
                        //    throw new Win32Exception(Marshal.GetLastWin32Error());
                        //}
                    }
                }
            }
    Все работает если запускать приложение из Visual Studio 2010, как в Debuge  так и в Relise. как только запускаю exe файл иногда при смене раскладки по кнопке на панели выскакивает ошибка: Culture is not supported. Parameter name: culture 0 (0x0000) is an invalid culture identifier. ошибка не отлавливается в коде с помощью try catch, пробовал JIT отладку но не помогло, выяснил только то, что ошибка из библиотеки .NET Framework. Если при возникновении ошибки нажать пропустить, то далее приложение работает нормально. что делать в данной ситуации?

    • Изменено Dobrii 14 января 2013 г. 5:52
    10 января 2013 г. 6:44

Ответы

  • Проверьте ActivePrcss, как я писал выше, оно будет совпадать с вашим окнов в моменты ошибок. С виду в проверке ошибок быть не должно, если только ThisPrcss имеет ошибочную ссылку на процесс. Попробуйте поискать ошибку в этом направлении - переписать условие проверки на свое окно, если оно, как я сказал выше, не работает

    Для связи [mail]

    • Помечено в качестве ответа Dobrii 17 января 2013 г. 6:21
    16 января 2013 г. 14:21

Все ответы

  • что делать в данной ситуации?
    Для начала Вам бы не помешало оформить код должным образом. При написании сообщения на форуме есть кнопка "Вставить блок кода"
    10 января 2013 г. 19:21
  • Привет

    А вы точно не оборачиваете в try-catch что-то, что может вызывать и работать в другом потоке программы? Тогда try-catch должнен быть внутри функции, в которой выполняется новый поток.

    А так раз возникает ошибка, то лучше найти ее причину, а не избегать ее.


    Для связи [mail]

    11 января 2013 г. 13:21
  •  точно не оборачиваю в try-catch ничего, что может вызывать и работать в отдельном потоке.
    14 января 2013 г. 5:54

  • Я что-то не вижу в приведенном коде инициализации CurCulture.
    14 января 2013 г. 10:28
  • инициализация CurCulture происходит в
     private void frm_Main_Load(object sender, EventArgs e)
            {
                timer_lang.Start();
                ThisPrcss = GetForegroundWindow();
                CurCulture = CultureInfo.CurrentCulture.Name;
                foreach (InputLanguage CLang in InputLanguage.InstalledInputLanguages)
                {
                    if (CLang.Culture.Name.Contains("ru"))
                    {
                        RUS = CLang;
                        RusHandl = RUS.Handle;
                        LANG_RUS = RUS.Culture.LCID;
                    }
                    if (CLang.Culture.Name.Contains("en"))
                    {
                        ENG = CLang;
                        EngHandl = ENG.Handle;
                        LANG_ENG = ENG.Culture.LCID;
                    }
                }
                RLayout = ActivateKeyboardLayout(LANG_RUS, 0);
                ELayout = ActivateKeyboardLayout(LANG_ENG, 0);
                
    
                    if (CurCulture.Contains("ru"))
                    {
                        btn_globalisation.Text = "RU";
                        btn_globalisation.Image = Properties.Resources.Россия;
                    }
                    else
                    {
                        btn_globalisation.Text = "EN";
                        btn_globalisation.Image = Properties.Resources.США;
                    }
            }

    15 января 2013 г. 5:47
  • Не уверен, что поможет, но попробуйте

     timer_lang.Start();
    

    перенести в конец функции.


    15 января 2013 г. 6:36
  • а если можно аргументируйте пожалуйста ответ. потому что не хочется в дальнейшем столкнуться с подобной ситуацией и вообще хочется понимать физику происходящего процесса
    • Изменено Dobrii 15 января 2013 г. 8:00
    15 января 2013 г. 8:00
  • Перемещение запуска таймера не помогло.

    вот дополнительно инфо об ошибке

    Подробная информация об использовании оперативной 
    (JIT) отладки вместо данного диалогового 
    окна содержится в конце этого сообщения.

    ************** Текст исключения **************
    System.Globalization.CultureNotFoundException: Неподдерживаемая культура.
    Имя параметра: culture
    0 (0x0000) - недопустимый идентификатор культуры.
       в System.Globalization.CultureInfo.InitializeFromCultureId(Int32 culture, Boolean useUserOverride)
       в System.Globalization.CultureInfo..ctor(Int32 culture, Boolean useUserOverride)
       в System.Windows.Forms.InputLanguage.get_Culture()
       в System.Windows.Forms.InputLanguageChangingEventArgs..ctor(InputLanguage inputLanguage, Boolean sysCharSet)
       в System.Windows.Forms.InputLanguage.CreateInputLanguageChangingEventArgs(Message m)
       в System.Windows.Forms.Control.WmInputLangChangeRequest(Message& m)
       в System.Windows.Forms.Control.WndProc(Message& m)
       в System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       в System.Windows.Forms.ContainerControl.WndProc(Message& m)
       в System.Windows.Forms.Form.WndProc(Message& m)
       в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


    ************** Загруженные сборки **************
    mscorlib
        Версия сборки: 4.0.0.0
        Версия Win32: 4.0.30319.17929 built by: FX45RTMREL
        CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
    ----------------------------------------
    MPanel
        Версия сборки: 1.0.0.0
        Версия Win32: 1.0.0.0
        CodeBase: file:///F:/Release/MPanel.exe
    ----------------------------------------
    System.Windows.Forms
        Версия сборки: 4.0.0.0
        Версия Win32: 4.0.30319.17929 built by: FX45RTMREL
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
    ----------------------------------------
    System.Drawing
        Версия сборки: 4.0.0.0
        Версия Win32: 4.0.30319.17929 built by: FX45RTMREL
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
    ----------------------------------------
    System
        Версия сборки: 4.0.0.0
        Версия Win32: 4.0.30319.17929 built by: FX45RTMREL
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
    ----------------------------------------
    Microsoft.VisualBasic
        Версия сборки: 10.0.0.0
        Версия Win32: 11.0.50709.17929 built by: FX45RTMREL
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
    ----------------------------------------
    System.Core
        Версия сборки: 4.0.0.0
        Версия Win32: 4.0.30319.17929 built by: FX45RTMREL
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
    ----------------------------------------
    System.Runtime.Remoting
        Версия сборки: 4.0.0.0
        Версия Win32: 4.0.30319.17929 built by: FX45RTMREL
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
    ----------------------------------------
    System.Configuration
        Версия сборки: 4.0.0.0
        Версия Win32: 4.0.30319.17929 built by: FX45RTMREL
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
    ----------------------------------------
    System.Xml
        Версия сборки: 4.0.0.0
        Версия Win32: 4.0.30319.17929 built by: FX45RTMREL
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
    ----------------------------------------
    mscorlib.resources
        Версия сборки: 4.0.0.0
        Версия Win32: 4.0.30319.17929 built by: FX45RTMREL
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_ru_b77a5c561934e089/mscorlib.resources.dll
    ----------------------------------------
    System.Windows.Forms.resources
        Версия сборки: 4.0.0.0
        Версия Win32: 4.0.30319.17929 built by: FX45RTMREL
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_ru_b77a5c561934e089/System.Windows.Forms.resources.dll
    ----------------------------------------

    ************** Оперативная отладка (JIT) **************
    Для подключения оперативной (JIT) отладки файл .config данного
    приложения или компьютера (machine.config) должен иметь
    значение jitDebugging, установленное в секции system.windows.forms.
    Приложение также должно быть скомпилировано с включенной
    отладкой.

    Например:

    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>

    При включенной отладке JIT любое необрабатываемое исключение
    пересылается отладчику JIT, зарегистрированному на данном компьютере,
    вместо того чтобы обрабатываться данным диалоговым окном.


    • Изменено Dobrii 15 января 2013 г. 8:16
    15 января 2013 г. 8:11
  • на jit отладке ошибка в mscorlib при инициализации культуры InitializeFromCultureId(Int32 culture, Boolean useUserOverride) culture 0x00000. но почему это происходит. когда посылаю сообщение

     CurPtr = PostMessage(ActivPrcss, WM_INPUTLANGCHANGEREQUEST, new IntPtr(INPUTLANGCHANGE_FORWARD), IntPtr.Zero);

    то есть ошибка уже в библиотеке .NET. от куда он берет этот ноль. если при появлении ошибки нажать продолжить, то далее все работает корректно

    15 января 2013 г. 8:15
  •  timer_lang.Start();

    запускает таймер, в котором идет обработка переменной

    CurCulture

    которая к моменту запуска таймера еще не инициализирована (установлена в null).

    Правда т.к. Вы используете Windows.Forms.Timer выполняться всё должно в одном GUI потоке, и обработчик таймера по идее не должен запускаться до момента окончания

     frm_Main_Load()

    поэтому я и написал, что "не уверен".

    15 января 2013 г. 8:17
  • ага, все  понятно.))))) но не помог перенос запуска таймера в конец загрузки формы
    15 января 2013 г. 10:35
  • Привет.

    Проблема у вас возникает в том случае, когда вы меняете язык самого приложение, т.е. посылаете сообщение о смене языка самому себе. Вам нужно исправлять определение активного окна. Для проверки добавьте на форму richtextbox и выводите в него имя процесса для которого собираетесь менять язык:

     richTextBox1.AppendText(Process.GetProcessById((int)activepid).ProcessName + "\r\n");


    Для связи [mail]

    15 января 2013 г. 11:14
  • разве этого не достаточно

      IntPtr CurPtr;
                    uint activepid; // id последнего активного окна кроме моего
                    uint thispid; // id процесса моего окна
                    //получаем id процесса активного окна
                    GetWindowThreadProcessId(ActivPrcss, out activepid);
                    GetWindowThreadProcessId(ThisPrcss, out thispid);
                    if (activepid != thispid) // проверка на то что бы активным было не мое окно
                    {

    если не прав, пожалуйста растолкуйте))))))))
    • Изменено Dobrii 15 января 2013 г. 11:49
    15 января 2013 г. 11:47
  • Проверьте ActivePrcss, как я писал выше, оно будет совпадать с вашим окнов в моменты ошибок. С виду в проверке ошибок быть не должно, если только ThisPrcss имеет ошибочную ссылку на процесс. Попробуйте поискать ошибку в этом направлении - переписать условие проверки на свое окно, если оно, как я сказал выше, не работает

    Для связи [mail]

    • Помечено в качестве ответа Dobrii 17 января 2013 г. 6:21
    16 января 2013 г. 14:21
  • Действительно, вы были правы. В момент ошибки сообщение отправляется моему окну 

    app.MainForm.Controls["richTextBox1"].Text
    "thispid = MPanel.vshost; activpid = chrome\n
    отправили сообщение activpid = chrome\n
    thispid = MPanel.vshost; activpid = chrome\n
    отправили сообщение activpid = chrome\n
    thispid = chrome; activpid = MPanel.vshost\n
    отправили сообщение activpid = MPanel.vshost\n"

    Но почему это происходит, почему в thispid попало значение активного процесса, а в activpid попал процесс моего окна. ??????

    17 января 2013 г. 6:17
  • Спасибо за оказанную помощь! Проблему решил так как и предложил Abolmasov Dmitry

    Почему нельзя посылать сообщение самому себе (из приложения в свое же приложение)??????? Что происходит в этот момент?


    • Изменено Dobrii 17 января 2013 г. 6:31
    17 января 2013 г. 6:20