Получить дескриптор вызывающего окна

есть программа, которая вызывает метод в моей C# dll. В этом методе dll мне нужно иметь дескриптор окна программы/окна, которая вызвала мою dll.

как получить этот "вызывающий дескриптор окна"?

Спасибо!


person Tobi    schedule 09.03.2010    source источник
comment
Как называется метод? Можете ли вы добавить параметр hwnd?   -  person SLaks    schedule 09.03.2010


Ответы (2)


Это может вернуть дескриптор главного окна.

System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle

Насколько я знаю, нет никакого способа получить конкретное окно, потому что это не более чем объект формы. Но у класса Form есть свойство Handle. Вы можете передать его в качестве аргумента вызовам метода dll.

person ILya    schedule 09.03.2010
comment
вот в чем проблема, я не могу передать аргумент моему методу dll из исходной программы. поэтому я не могу пройти мимо ручки. мне нужно найти дескриптор в моем методе dll - person Tobi; 09.03.2010
comment
Хммм... К сожалению единственный способ решить проблему - это немного переписать dll. Я не вижу здесь никаких проблем (если и dll, и исполняемый файл написаны вами, значит, у вас есть исходники), разве что дизайн сборки пострадает... - person ILya; 09.03.2010
comment
да, я реализовал код, который вы мне сказали, это работает. у меня нет источников вызывающей программы, поэтому мне пришлось использовать GetCurrentProcess().MainWindowHandle. Я думаю, что нет другого чистого пути? - person Tobi; 09.03.2010
comment
Да, я не могу представить другого решения. Другие методы будут вероятностными, поэтому их нельзя выбирать. - person ILya; 10.03.2010
comment
Спустя годы, но я столкнулся с той же проблемой, я создаю приложение с плагинами, и мне нужно создать крючок для сообщений Windows из dll, и я не могу получить дескриптор основного приложения на всю жизнь. - person Wobbles; 09.03.2015

Вы не можете: окна не вызывают методы, код вызывает методы.

В идеале вы должны добавить в свой метод параметр дескриптора окна. Если это абсолютно невозможно, вы можете использовать, скажем, функцию GetActiveWindow API, чтобы активировать окно в текущем потоке. Это не гарантирует работу; может окна не открыты.

Для чего нужна оконная ручка?

person Tim Robinson    schedule 09.03.2010
comment
чтобы изменить вызывающее окно, в настоящее время я использую GetForegroundWindow, но это не очень хорошее решение, поэтому, если пользователь немедленно меняет окно, у меня будет неправильный дескриптор - person Tobi; 09.03.2010