Я могу получить поведение установки моего владельца формы WinForms, использующего hwnd / NativeWindow?

Все, что вам нужно, это заставить вашу строку в нижнем регистре (или в верхнем регистре) перед проверкой ее содержимого:

if( res.toLowerCase().search('em') !== -1){ do(stuff); }

Для обработки замены фактического значения подстроки в res, что-то вроде этого должно работать: [113 ]

let caseInsensitiveUnit = "em";
let unitLength;
let actualUnit;
let position = res.toLowerCase().search(caseInsensitiveUnit);
if(position > -1){ 
    unitLength = caseInsensitiveUnit.length; 
    actualUnit = res.substring(postion, position + unitLength);
    res.replace(actualUnit, "");
}
6
задан T.Rob 27 December 2011 в 18:13
поделиться

2 ответа

Таким образом, Вы называете класс Windows Form C# от VB6, что означает, что Вы, вероятно, используете также Show() или ShowDialog(), корректный? Оба из тех методов также берут параметр IWin32Window, который просто определяет объект, который возвращает свойство IntPtr под названием Дескриптор.

Так... необходимо добавить перегруженного конструктора (или метод ShowDialog) для классов Windows Forms, которые берут a long в качестве параметра, таким образом, можно передать VB6 hwnd форме. Однажды в коде C#, необходимо создать IntPtr из hwnd и присвоить его a NativeWindow возразите и затем передайте это как владельца.

Что-то вроде этого должно работать, хотя это не тестируется:

public DialogResult ShowDialog(long hwnd)
{
   IntPtr handle = new IntPtr(hwnd);
   try
   {
      NativeWindow nativeWindow = new NativeWindow();

      nativeWindow.AssignHandle(handle);
      return this.ShowDialog(nativeWindow);
   }
   finally
   {
      handle = IntPtr.Zero;
   }
}
9
ответ дан 9 December 2019 в 22:42
поделиться

Это слишком длинно для регистрации как комментарий...

Я думаю проблема, в которой Вы работаете к, способ, которым Вы перенесли код, который я представил в перегрузке ShowDialog. Если Вы следуете что Ваш GetWindowFromHost код делает, он проходит следующие шаги:

  1. Создает новый IntPtr из данного hwnd.
  2. Создает новый объект NativeWindow и присваивается, это - дескриптор, чтобы быть IntPtr.
  3. Устанавливает IntPtr (в наконец блок), чтобы быть IntPtr. Нуль.

Я думаю, что это - это наконец блок, который вызывает Вас проблемы. В моем коде наконец блок бежал бы за вызовом к this.ShowDialog(nativeWindow) законченный. В той точке больше не использовался дескриптор (IntPtr). В Вашем коде Вы возвращаетесь IWin32Window это должно все еще содержать ссылку на то, что IntPtr, который в то время, когда Вы звоните launchTarget.ShowDialog(parentWindow) IntPtr. Нуль.

Попытайтесь изменить свой код для сходства с этим:

private NativeWindow GetWindowFromHost(int hwnd)
{
   IntPtr handle = new IntPtr(hwnd);
   NativeWindow nativeWindow = new NativeWindow();
   nativeWindow.AssignHandle(handle);
   return window;
}

И затем измените свой код вызова для сходства с этим:

Form launchTarget = FormFactory.GetForm(xxx);  // psuedo-code for generic form 
loaderlaunchTarget.StartPosition = FormStartPosition.CenterParent;
NativeWindow parentWindow = GetWindowFromHwnd(hwnd);

try
{
   launchTarget.ShowDialog(parentWindow);
}
finally
{
   parentWindow.DestroyHandle();
}

Эти изменения должны работать, но снова это не тестируется.

2
ответ дан 9 December 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: