[Mono-dev] Embed: MainWindow
Robert Jordan
robertj at gmx.net
Tue Feb 2 20:44:49 EST 2010
On 03.02.2010 00:39, Steve Baer wrote:
>
> Hi,
> I've been working on embedding mono in a C++ Windows application (and an OSX
> app.) My C++ code calls a C# function through mono which in turn calls
> System.Windows.Forms.MessageBox.Show("Hi from mono");
>
> This shows a message box, but it is not modal and my application crashes if
> I switch focus away from the message box. I think the problem is that mono
> doesn't know about the main window of my native application because I always
> get IntPtr.Zero when calling
> System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;
This property always returns zero because it's not implemented.
Under Unix/Mac OS it would be meaningless at best.
> Is there something like a function in the embedding API that let's me tell
> mono the main window handle for my application? Any clues no what to try
> next would be appreciated.
The embedding API does not cover the windowing environment at all.
Under Windows, the following might work:
1) get the value (IntPtr) of the field
System.Windows.Forms.XplatUIWin32.FosterParent
using the embedded API.
This is the parent window handle of all SWF windows.
2) re-parent the foster window:
SetParent(fosterParent, handleOfYourMainWindow);
See SetParent on MSDN.
Note that you must perform these steps from the thread that has
created the message loop of your C++ app.
Another restriction: you can't call a form's Show() method.
Always use ShowDialog(), because you can't create another
message loop in the same thread.
Robert
More information about the Mono-devel-list
mailing list