Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как получить HWND окна 1С (обычные формы)

Как получить HWND окна 1С (обычные формы)
Я
   Iori
 
29.06.20 - 09:57
Задача следующая. На форме элемента номенклатуры стоит кнопка, которая с помощью "ЗапуститьПриложение()" открывает окно на C#. окно работает, но есть недостатки. Окно может "затеряться" под окном 1С, что приводит либо к повторному открытию или другим не желательным эфектам. Программер С# спрашивает, могу ли я передать HWND окна 1С в параметрах. Тогда окно С# можно открыть как дочернее, что даст возможность убрать недостатки... Задача оказалась не тривиальная, поскольку средствами 1С этот параметр получить не возможно (я так понял) и нужно привлекать внешние компоненты. Кто то может что то посоветовать по этому вопросу?
   dmpl
 
1 - 29.06.20 - 10:00
(0) А что, parent PID пустой?
   Iori
 
2 - 29.06.20 - 10:08
Я не знаю как получить parent PID. Подскажите
   dmpl
 
3 - 29.06.20 - 10:09
(2) Ну, в Far'е можно через Process List посмотреть, пока приложение работает.
   vfire1000
 
4 - 29.06.20 - 10:14
Пусть программмер на С# активизирует (выводит поверх окон) свою свистоперделку, если она запускается повторно, либо перепишет её под компоненту для 1С. Программно (1С) хэндл окна не получить.
   asjasj555
 
5 - 29.06.20 - 10:17
В C# окно по заголовку найти можно, что то типа 

[DllImport("user32.dll")]
FindWindow(null, "Заголовок окна 1с");
   Iori
 
6 - 29.06.20 - 10:18
А это можно сделать, если открыто несколько окон 1С?
   polosov
 
7 - 29.06.20 - 10:19
(0) А зачем такие сложности?
Ну потерялось окно C# под другими окнами, ну нажали еще раз на кнопку. Пусть приложение проверяет, что уже есть инстанс и вместо открытия приложения просто активизирует свое открытое окно и переместит его на передний план.
   dmpl
 
8 - 29.06.20 - 10:20
В конце-концов, в параметрах GUID можно передать...
   Asmody
 
9 - 29.06.20 - 10:21
Посмотрите вот тут https://github.com/lintest/VanessaExt исходники ВК.
Она умеет получать активное окно.
   asjasj555
 
10 - 29.06.20 - 10:21
Там сложнее чуть, смотрите в сторону EnumWindowsProc
   H A D G E H O G s
 
11 - 29.06.20 - 10:22
Написать компоненту, которая переберет  top-level окна системы через EnumWindows. Для каждого окна системы получит его pid процесса через GetWindowThreadProcessId и сравнит с
GetCurrentProcessId. То, которое совпало - для него получаем класс окна через GetClassName. Нужный тебе класс можно посмотреть через process list или я тебе скину когда буду у компа.
   H A D G E H O G s
 
12 - 29.06.20 - 10:24
IExtendedLanguage кстати, сразу реализует метод получения хендла гласного окна, вспомнил.
   Garykom
 
13 - 29.06.20 - 10:25
(0) Не проще/лучше ли в ПолеHTML выводить без внешних окон на C# ?
   Garykom
 
14 - 29.06.20 - 10:28
(13)+ Если так надо то связать через JS с внешним приложением на C#
По этому принципу всякие крипто и прочие онлайн приложения работают, когда надо на компе юзера что то делать вне песочницы браузера
   polosov
 
15 - 29.06.20 - 10:29
(11) А разве процесс 1с не будет родительским по отношению к программе на C#?
   H A D G E H O G s
 
16 - 29.06.20 - 10:37
(15) В венде нет родительских и дочерних процессов
   Garykom
 
17 - 29.06.20 - 10:39
   mistеr
 
18 - 29.06.20 - 10:44
(16) Да ты шо
   polosov
 
19 - 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)
   DrZombi
 
20 - 29.06.20 - 10:55
(6) Да, можно.
   oleg_km
 
21 - 29.06.20 - 11:20
С какой-то версии 1С (между 8.3.10 и 8.3.16) окна 1С перестали быть окнами Windows. Только главное окно еще окно
   H A D G E H O G s
 
22 - 29.06.20 - 11:32
(17) (18) (19) Да, вы правы, я ошибся.
Ну тогда, (11) можно отдать C#-нику, пусть реализует в своей программе
   Serginio1
 
23 - 29.06.20 - 14:11
Ну можно получить дескриптор главного окна, а затем пробежаться по дочерним
http://catalog.mista.ru/public/457898/
   oleg_km
 
24 - 29.06.20 - 14:56
(23) Еще раз, все зависит от версии 1С. Только сейчас посмотрел - у 1С 8.3.16 даже обычные окна - не окна Windows
   Serginio1
 
25 - 29.06.20 - 14:56
   oleg_km
 
26 - 29.06.20 - 15:04
(25) Сергей, тормознись. Пусть ТС сначала озвучит, какая у него версия 1С.
   Serginio1
 
27 - 29.06.20 - 15:06
(24) Давно не брал я в руки
то есть connection as IExtWndsSupport возвращает null?
Если нет, что что возвращает GetAppMainFrame
   Serginio1
 
28 - 29.06.20 - 15:08
27 + понял по 21. Ясно
   Serginio1
 
29 - 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С
 
 Рекламное место пустует
   Emery
 
31 - 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 нет дочерних окон!
   Dmitry1c
 
32 - 01.07.20 - 09:41
(0) >приводит либо к повторному открытию

синглтон
   Сияющий в темноте
 
33 - 01.07.20 - 09:52
в windows,есть процесс родитель,но там указывается id процесса на момент создания текущего процесса,и внезапно,id процесса может быть повторно использован,так что сведения об id родителя родителем не является.
и,самое главное,завершение родителя ничего не делает с текущим процессом,даже не сбрасывает id.
   Сияющий в темноте
 
34 - 01.07.20 - 09:53
есть объект Mutex,который позволяет отследить запуск второй копии процесса,в ней просто нужно будет найти предвдущую копию и активизировать ее.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.