Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ToolTip в другом окне. Не работает... 
:(
    Опции темы
SqueeZe
  Дата 2.10.2009, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.10.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Пробую отобразить тултип для другого окна.


Код

public class WindowWrapper : System.Windows.Forms.IWin32Window {
public WindowWrapper(IntPtr handle) { _hwnd = handle; }
public IntPtr Handle { get { return _hwnd; } }
private IntPtr _hwnd;
}


В принципе все просто, но следующий код выбивает исключение.

Код

ToolTip tt = new ToolTip();
tt.ShowAlways = true;
tt.Show("Hello", new WindowWrapper(hWnd), 100, 100);


I get a "NullObjectReference Exception" - Object reference not set to an instance of an object. at 

Но почему то MessageBox, принимающий тот же объект, срабатывает на отлично!

Код

MessageBox.Show(new WindowWrapper(hWnd), "Hello World!");


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

Сразу скажу, задача - отображение ToolTip на полноэкранном Direct3D. Причем тот же autoit прекрасно справляется с этой задачей, но исходников его тоже нарыть не удалось. 

С Уважением, Константин.
PM MAIL ICQ   Вверх
diadiavova
Дата 2.10.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Вообще-то в описании метода ToolTip.Show о параметре window написано буквально следующее
Цитата

window: Элемент управления System.Windows.Forms.Control, для которого отображается всплывающая подсказка.
Видимо причина в том, что то окошко не является System.Windows.Forms.Control


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SqueeZe
Дата 2.10.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.10.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 1



И какие могут быть варианты решения данной проблемы?
PM MAIL ICQ   Вверх
mr.DUDA
Дата 4.10.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Можно вызвать NativeWindowControl.CreateFromHandle из handle окна, и для созданного контрола показать тултип:
Код

    public class NativeWindowControl : Control
    {
        private NativeWindowControl() { }

        [DllImport("user32.dll")]
        static extern IntPtr GetParent(IntPtr handle);
        [DllImport("user32.dll")]
        static extern int GetWindowThreadProcessId(IntPtr handle, ref int processId);

        public static NativeWindowControl CreateFromHandle(IntPtr handle)
        {
            // create control...
            NativeWindowControl ret = new NativeWindowControl();
            FieldInfo fi = typeof(Control).GetField("window", BindingFlags.NonPublic | BindingFlags.Instance);
            NativeWindow wnd = (NativeWindow)fi.GetValue(ret);
            wnd.AssignHandle(handle);
            ret.OnHandleCreated(EventArgs.Empty);
            ret.UpdateBounds();

            // ...and form
            Form form = new Form();
            IntPtr tmpHandle = handle, parentHandle = handle;
            int unused = 0;
            int currThreadId = GetWindowThreadProcessId(handle, ref unused);
            while ((tmpHandle = GetParent(parentHandle)) != IntPtr.Zero)
            {
                if (GetWindowThreadProcessId(tmpHandle, ref unused) != currThreadId)
                    break;
                parentHandle = tmpHandle;
            }
            wnd = (NativeWindow)fi.GetValue(form);
            wnd.AssignHandle(parentHandle);
            MethodInfo mi = typeof(Form).GetMethod("OnHandleCreated", BindingFlags.NonPublic | BindingFlags.Instance);
            mi.Invoke(form, new object[] { EventArgs.Empty });
            mi = typeof(Form).GetMethod("UpdateBounds", BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
            mi.Invoke(form, new object[0]);
            form.Visible = true;

            // bind them together
            fi = typeof(Control).GetField("parent", BindingFlags.NonPublic | BindingFlags.Instance);
            fi.SetValue(ret, form);

            return ret;
        }

        protected override void CreateHandle()
        {
        }
    }


 smile 


--------------------
user posted image
PM MAIL WWW   Вверх
SqueeZe
Дата 4.10.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 1.10.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Интересно, но на 17 строке цепляется к коду: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "" не из того потока, в котором он был создан."
PM MAIL ICQ   Вверх
mr.DUDA
Дата 4.10.2009, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Эту проверку можно вырубить:
Код
Control.CheckForIllegalCrossThreadCalls = false;



--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0693 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.