• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Открытие объекта в новом окне из плагина C#

Автор irina_c2011, 19.03.20, 08:54:38

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

irina_c2011

Здравствуйте!

Пытаюсь открыть объект в новом окне Лоцман ( т. е. cделать Ctrl+O) из плагина. Но ничего не получаю (не ошибок не результата). Тоже самое получаю при попытке перйти на объект, и перейти на потомка. Не могу понять, в чем ошибаюсь. Буду рада если подскажите или придложите другое решение. Пишу по аналогии с delphi вот так:

           
        [DllExport(C_FUNC_NAME, CallingConvention.StdCall)]
        public static void MainWindowOpen(IntPtr IPC)
        {

            IPluginCall Plugin = (IPluginCall)Marshal.GetTypedObjectForIUnknown(IPC, typeof(IPluginCall));



            wnd = new MainWindow();

          wnd.listViewerror.MouseDoubleClick += DoubleClickMouse;


            wnd.ShowDialog();
        }

       private static void DoubleClickMouse(object sender, MouseButtonEventArgs e)
        {
            var lsv = sender as ListView;
            var lsvItem = lsv.SelectedItem as ListViewItem;

            var lsvItem2 = lsv.SelectedItem as functionlibrary.Composition;

            string id;

            if (lsvItem2 != null)
            {
                id = lsvItem2.inid.ToString();


                try
                {
                    const int WM_USER= 0x0400;
                     PostMessage((IntPtr)Plugin.ClientHandle, (uint)(WM_USER + 101), (IntPtr)(Convert.ToInt32(id)), IntPtr.Zero);
                   

                }
                catch (Exception error)
                {
                    MessageBox.Show(error.ToString());
                }
            }
               
        }

   
        [DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

Chipollino

Для открытия объекта в новом окне (имитация команды Ctrl+O) нужно сообщение отправлять в главное окно Лоцмана, а его указатель хранится в IPluginCall.MainHandle
Так же в качестве wParam для PostMessage нужно передавать не IdVersion объекта, а указатель на структуру TMSGPARAMS в которой будет заполнено поле ObjectId


Почему не работает переход на потомка - возможно активный фрейм не является деревом, либо среди объектов выделенного в дереве объекта такой IdVersion отсутствует

Как вариант открытия объекта в новом окне можно ещё использовать библиотеку Ask.dll

irina_c2011

Пока по видимому, что то не допонимаю. Буду рада если подскажите. Теперь переписываю вот так:
 
  public struct TMSGPARAMS
    {
        public int ObjectId;

    }

        public unsafe static void StructId(string id)
            {
            const int WM_USER = 0x0400;
            TMSGPARAMS tmsgparms = new TMSGPARAMS();
             tmsgparms.ObjectId = Convert.ToInt32(id);
            TMSGPARAMS* t = &tmsgparms;

            try
            {
                PostMessage((IntPtr)Plugin.MainHandle, (uint)(WM_USER + 101), (IntPtr)t, IntPtr.Zero);
            }
            catch (Exception error)
            {
                MessageBox.Show(error.ToString());
            }
        }

          [DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]

        public static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

В итоге лоцман немного думает и ничего не делает. Если просмотреть пошагово. То что пишет t=0x0018ув6с error=null.

В случае бибилиотеки ask, нашла в ней функцию Execute(int hWnd, int hInstance, string stCmdLine, int dummy) так понимаю что первый параметр это указатель окна. Что задать остальными буду рада если подскажите, если это конечно она.


Пробывала  открывать вот так:

        private static void DoubleClickMouseSend(object sender, MouseButtonEventArgs e)
        {
            int iHandle = FindWindow(null, "BZSPLM_PROD - ЛОЦМАН - [Проекты]");

            SetForegroundWindow(iHandle);

            string keys = "";


            keys = "%"+"{ENTER}"; //"^O"; //

            wnd.Close();
            System.Windows.Forms.SendKeys.SendWait(keys);
        }
Если задаю ключ "F1" справку открывает,  а "%{ENTER}" и "^O" ничего не делает.

Chipollino

Из справки к 2018му лоцману
ЦитироватьTMSGPARAMS
--------------------------------------------------------------------------------
Информация об открываемых объектах
Значения
Поле   Тип   Описание
--------------------------------------------------------------------------------
Reserved   PChar   Зарезервировано должно быть nil
CheckOutName   PChar   Имя чекаута, которому должно принадлежать окно
ObjectId   DWORD   Идентификатор объекта, который должен быть открыт
ObjectIds   PChar   Список идентификаторов объектов, которые необходимо открыть в новом окне
--------------------------------------------------------------------------------
Поддерживается в версии
«ЛОЦМАН Клиент» 2011 или более поздней.

А по библиотеке Ask.dll, чтобы перейти на объект в окне проектов должен сработать примерно такой код на C#
ЦитироватьAsk.ICommand url = new Loodsman.URL();
string sParams = string.Join("|", 0, Plugin.DBName, 0, id);
string Base64Params = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(sParams));
url.Execute(0, 0, "Action=Navigate,params=" + Base64Params , 0);
Если не задавать указатель на окно, то будет обращение к уже открытому лоцману, либо запустится новый, если он не запущен.

irina_c2011

Большое спасибо) Доберусь до Лоцман попробую