|
Как получить HWND окна 1С (обычные формы) | ☑ | ||
---|---|---|---|---|
0
Iori
29.06.20
✎
09:57
|
Задача следующая. На форме элемента номенклатуры стоит кнопка, которая с помощью "ЗапуститьПриложение()" открывает окно на C#. окно работает, но есть недостатки. Окно может "затеряться" под окном 1С, что приводит либо к повторному открытию или другим не желательным эфектам. Программер С# спрашивает, могу ли я передать HWND окна 1С в параметрах. Тогда окно С# можно открыть как дочернее, что даст возможность убрать недостатки... Задача оказалась не тривиальная, поскольку средствами 1С этот параметр получить не возможно (я так понял) и нужно привлекать внешние компоненты. Кто то может что то посоветовать по этому вопросу?
|
|||
1
dmpl
29.06.20
✎
10:00
|
(0) А что, parent PID пустой?
|
|||
2
Iori
29.06.20
✎
10:08
|
Я не знаю как получить parent PID. Подскажите
|
|||
3
dmpl
29.06.20
✎
10:09
|
(2) Ну, в Far'е можно через Process List посмотреть, пока приложение работает.
|
|||
4
vfire1000
29.06.20
✎
10:14
|
Пусть программмер на С# активизирует (выводит поверх окон) свою свистоперделку, если она запускается повторно, либо перепишет её под компоненту для 1С. Программно (1С) хэндл окна не получить.
|
|||
5
asjasj555
29.06.20
✎
10:17
|
В C# окно по заголовку найти можно, что то типа
[DllImport("user32.dll")] FindWindow(null, "Заголовок окна 1с"); |
|||
6
Iori
29.06.20
✎
10:18
|
А это можно сделать, если открыто несколько окон 1С?
|
|||
7
polosov
29.06.20
✎
10:19
|
(0) А зачем такие сложности?
Ну потерялось окно C# под другими окнами, ну нажали еще раз на кнопку. Пусть приложение проверяет, что уже есть инстанс и вместо открытия приложения просто активизирует свое открытое окно и переместит его на передний план. |
|||
8
dmpl
29.06.20
✎
10:20
|
В конце-концов, в параметрах GUID можно передать...
|
|||
9
Asmody
29.06.20
✎
10:21
|
Посмотрите вот тут https://github.com/lintest/VanessaExt исходники ВК.
Она умеет получать активное окно. |
|||
10
asjasj555
29.06.20
✎
10:21
|
Там сложнее чуть, смотрите в сторону EnumWindowsProc
|
|||
11
H A D G E H O G s
29.06.20
✎
10:22
|
Написать компоненту, которая переберет top-level окна системы через EnumWindows. Для каждого окна системы получит его pid процесса через GetWindowThreadProcessId и сравнит с
GetCurrentProcessId. То, которое совпало - для него получаем класс окна через GetClassName. Нужный тебе класс можно посмотреть через process list или я тебе скину когда буду у компа. |
|||
12
H A D G E H O G s
29.06.20
✎
10:24
|
IExtendedLanguage кстати, сразу реализует метод получения хендла гласного окна, вспомнил.
|
|||
13
Garykom
гуру
29.06.20
✎
10:25
|
(0) Не проще/лучше ли в ПолеHTML выводить без внешних окон на C# ?
|
|||
14
Garykom
гуру
29.06.20
✎
10:28
|
(13)+ Если так надо то связать через JS с внешним приложением на C#
По этому принципу всякие крипто и прочие онлайн приложения работают, когда надо на компе юзера что то делать вне песочницы браузера |
|||
15
polosov
29.06.20
✎
10:29
|
(11) А разве процесс 1с не будет родительским по отношению к программе на C#?
|
|||
16
H A D G E H O G s
29.06.20
✎
10:37
|
(15) В венде нет родительских и дочерних процессов
|
|||
17
Garykom
гуру
29.06.20
✎
10:39
|
||||
18
mistеr
29.06.20
✎
10:44
|
(16) Да ты шо
|
|||
19
polosov
29.06.20
✎
10:45
|
(16) https://stackoverflow.com/questions/2531837/how-can-i-get-the-pid-of-the-parent-process-of-my-application/16756808
А это уже не актуально? (давно не ковырял WinApi) |
|||
20
DrZombi
гуру
29.06.20
✎
10:55
|
(6) Да, можно.
|
|||
21
oleg_km
29.06.20
✎
11:20
|
С какой-то версии 1С (между 8.3.10 и 8.3.16) окна 1С перестали быть окнами Windows. Только главное окно еще окно
|
|||
22
H A D G E H O G s
29.06.20
✎
11:32
|
(17) (18) (19) Да, вы правы, я ошибся.
Ну тогда, (11) можно отдать C#-нику, пусть реализует в своей программе |
|||
23
Serginio1
29.06.20
✎
14:11
|
Ну можно получить дескриптор главного окна, а затем пробежаться по дочерним
http://catalog.mista.ru/public/457898/ |
|||
24
oleg_km
29.06.20
✎
14:56
|
(23) Еще раз, все зависит от версии 1С. Только сейчас посмотрел - у 1С 8.3.16 даже обычные окна - не окна Windows
|
|||
25
Serginio1
29.06.20
✎
14:56
|
||||
26
oleg_km
29.06.20
✎
15:04
|
(25) Сергей, тормознись. Пусть ТС сначала озвучит, какая у него версия 1С.
|
|||
27
Serginio1
29.06.20
✎
15:06
|
(24) Давно не брал я в руки
то есть connection as IExtWndsSupport возвращает null? Если нет, что что возвращает GetAppMainFrame |
|||
28
Serginio1
29.06.20
✎
15:08
|
27 + понял по 21. Ясно
|
|||
29
Serginio1
29.06.20
✎
15:10
|
(26) Понял ему нужно владельца присвоить. Там есть пример
public string СоздатьОкно() { // m_1cApp.AppDispatch.Сообщить("Привет из ВК"); // не работает для упрощения работы создань динамический объект ДинамикГК // выполняющий аналогичную фунцию IExtWndsSupport n; ГК.Сообщить("Привет из ВК", ГК.СтатусСообщения.Важное); n = (IExtWndsSupport)Object1C; IntPtr hwnd; n.GetAppMainFrame(out hwnd); // Создаем форму, устанавливаем нативные хэндлы и устанвливаем окно 1С владельцем нетовского окна var form = new Form1(); form.CreateControl(); SetOwner(form.Handle.ToInt32(), hwnd.ToInt32()); form.EventTo1C = Object1C as IAsyncEvent; form.Show(); return "Методы ВК выполнены!"; } |
|||
30
Кирпич
29.06.20
✎
15:15
|
Ну пускай выведет окно поверх всех окон. Какие проюлемы. Нафига тут HWND и окна 1С
|
|||
31
Emery
01.07.20
✎
07:11
|
> могу ли я передать HWND окна 1С в параметрах
> средствами 1С этот параметр получить не возможно (я так понял) и нужно привлекать внешние компоненты Строгое решение задачи требует дополнительной информации. Но если речь идет просто о получении хэндла окна 1С, то да, удобно это делать через внешние компоненты, хотя можно использовать различные внешние скриптовые движки из среды 1С, например, AHK ( https://autohotkey.com/ ). Пример подходящей ВК можно посмотреть в моей статье: «Можно ли в 1С не соблюдать технологию внешних компонент? Или Как поздравить коллег с помощью 1С?» ( https://habr.com/ru/post/466713/ ). Для главного окна "1С:Предприятие": HWND hMainWnd = GetForegroundWindow(); Для дочернего окна получаем: HWND hChildWnd = GetWindow(hMainWnd, GW_CHILD); Там есть код, как получить конкретное дочернее окно, например, MDIClient’а. Заметим, что у 1С83 нет дочерних окон! |
|||
32
Dmitry1c
01.07.20
✎
09:41
|
(0) >приводит либо к повторному открытию
синглтон |
|||
33
Сияющий в темноте
01.07.20
✎
09:52
|
в windows,есть процесс родитель,но там указывается id процесса на момент создания текущего процесса,и внезапно,id процесса может быть повторно использован,так что сведения об id родителя родителем не является.
и,самое главное,завершение родителя ничего не делает с текущим процессом,даже не сбрасывает id. |
|||
34
Сияющий в темноте
01.07.20
✎
09:53
|
есть объект Mutex,который позволяет отследить запуск второй копии процесса,в ней просто нужно будет найти предвдущую копию и активизировать ее.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |