| ♥ 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!
Marcado como spam |
| 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. Marcado como spam |