2011-03-23 121 views
1

是否可以使用Mono将Windows消息(WM _...)发送到其他应用程序(假设我的应用程序在Windows上运行)?另一个相关的问题是在Mono应用程序中是否有任何方法使用DDE?用Mono发送Windows消息

谢谢!

回答

2

好,如果我是你,我会从

  • 单strarted到winapi32
  • 发送使用winapi32

所以只是尝试任何 “程序hello_world” 样品胜利的消息。 (我还没有现在单声道,这个遗憾)

例如,你可能只是编译下面的代码:

(从http://boycook.wordpress.com/2008/07/29/c-win32-messaging-with-sendmessage-and-wm_copydata/被盗)

using System.Runtime.InteropServices; 
public class MessageHelper 
{ 

[DllImport("User32.dll")] 
public static extern int SendMessage(int hWnd, int Msg, int wParam, 
ref COPYDATASTRUCT lParam); 
} 

//Used for WM_COPYDATA for string messages 
public struct COPYDATASTRUCT 
{ 
    public IntPtr dwData; 
    public int cbData; 
    [MarshalAs(UnmanagedType.LPStr)] 
    public string lpData; 
} 

我想它编译它不thow DllNotFoundException或EntryPointNotFoundException当你调用

MessageHelper.SendMessage(100, 100, new COPYDATASTRUCT()); 

如果你有一些问题,这个...嗯..您可以在运行时加载mscorlib.dll。 但这种方式有难闻的气味。

而且你可能会发现这里的一些细节http://www.mono-project.com/Interop_with_Native_Libraries

+0

这个问题有点模糊不清。 我不知道你已经拥有了什么以及你实际需要什么。 例如,您应该在窗口上接收处理程序,以便接收您的消息。 也可能你想注册自己的窗口消息。 或者,如果您确定您的程序将用于WinXp或更高版本,则只能尝试使用mscorlib.dll [](http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices。 allowreversepinvokecallsattribute%28v = VS.90%29.aspx) 等等))) – VMykyt 2011-03-23 21:07:09

+0

谢谢。这似乎工作,即使我使用GTK#工具包,对吗? (对不起,我是新手)。谢谢! – brian 2011-03-23 22:07:07

+0

正确。 GTK#只是一个框架。有些时候我玩混合单声道组件与MS.NET程序集。这工作得很好。 另一方面,由于您使用GTK#,因此看起来像您希望跨平台应用程序。在这种情况下,你可能不得不使用类似动态加载的东西。我不确定你的应用程序在Linux上的p/invoke行为。 – VMykyt 2011-03-23 22:21:33

2

是的,你应该能够发送WM_ *消息,并从单上的Windows应用程序完全像任何其他Windows应用程序。

Mono Winforms在Windows上运行时模仿并集成常规的Windows消息泵。

+0

如果我使用GTK#toolkit for my app,那么这不起作用? – brian 2011-03-23 22:06:04

+0

@brian ...不确定,但我怀疑为GTK#工具包编写的应用程序在Windows上运行。 – kenny 2011-03-23 22:14:41

+0

谢谢。我认为GTK#是跨平台,因为monodevelop是写在它上面的。 – brian 2011-03-23 22:38:13