Fórum
Ver pergunta

DLL Registada em Extensibilidade com Formulários / Windows API – V9   

67 visualizações
1
0

Bom dia,

 

Num post anterior indicaram que é possivel na V9 registar dll´s com formularios e depois aceder a eles via menus, isto recorrendo a Windows API.

É possivel ver algum exemplo de utilização da windows API implementada na V9, ou alguma vez alguem fez algo do genero?

 

Obrigado !

Cps!

 

Faça login para poder traduzir
Integração
Administrador
Marcado como spam
Criado há 6 anos e 3 meses datasolid
d
datasolid Iniciante
1 respostas
0
Resposta privada

Colocar janelas dentro do ERP com recurso à API do windows é um processo sensivel e para o qual deve ter muito cuidado ao fazer para não causar instabilidade no sistema. Antes de fazer sugiro alguma leitura sobre o tema Programming for Windows API.

Neste caso em concreto começe por adiconar um interfaçe e faça a alteração dos ID's

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace MdiExtender
{
    [ComVisible(true)]
    [Guid("F076E2B4-6FC8-4CA4-99B9-AB1AAF97E8CF")]
    public interface IHostWindow
    {
        void Mostra(string wTitle);

    }
}

Faça a implementação desse interfaçe e faça a alteração dos ID's

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace MdiExtender
{
    [ComVisible(true)]
    [Guid("D6B5474F-F645-4470-9760-7ABE526611CB")]
    [ClassInterface(ClassInterfaceType.None)]
    public class HostWindows : IHostWindow
    {
        #region IHostWindow 

        public void Mostra(string wTitle)
        {
            SampleForm sampleForm = new SampleForm();

            MDIExtender.SetMDIForm(sampleForm, wTitle);
            sampleForm.Show();
        }
        #endregion
    }
}

Por fim crie crie uma classe concreta para a trabalhar a janela dentro da aplicação.

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MdiExtender
{
    public static class MDIExtender
    {
        #region DLLImport

        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

        [DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        #endregion

        #region Private Properties

            private static IntPtr MainWindowhWnd { get; set; }

        #endregion

        private static IntPtr FindWindow(string windowName, bool wait)
        {
            IntPtr hWnd = FindWindow(null, windowName);

            while (wait && hWnd == (IntPtr)0)
            {
                System.Threading.Thread.Sleep(500);
                hWnd = FindWindow(null, windowName);
            }

            return hWnd;
        }

        public static void SetMDIForm(Form oFrm, string WindowTitle)
        {
            IntPtr hw = new IntPtr();         

            if (MainWindowhWnd == IntPtr.Zero)
            {
                hw = FindWindow(WindowTitle, false);
            }
            else
            {
                hw = MainWindowhWnd;
            }

            hw = FindWindowEx(hw, IntPtr.Zero, "MDIClient", "");
            SetParent(oFrm.Handle, hw);
        }

    }
}

Por fim exponha o seu projeto como COM VISIBLE e no VBA quando referenciar este metodo passe o titulo do seu formulário.

Desta forma o seu formulário vai apareçer dentro do MDI do ERP.

Faça login para poder traduzir
Marcado como spam
Criado há 6 anos e 3 meses sergiosereno
sergiosereno Most Valuable Professional