我们正在开发WPF中的UI控件,以便在现有的Windows窗体/ MFC应用程序引擎(Rhino3D)中使用。
应用程序引擎公开了创建"Dockbar“的能力,它基本上允许您将Windows窗体控件放置在子窗口中,该窗口可以停靠到engine Interface。
我试图将一个简单的WPF TextBox放在一个ElementHost控件中,该控件被添加到Dockbar中。乍一看,这似乎很好;但是在尝试键入TextBox之后,只有某些序列实际出现在TextBox中。DELETE、BACKSPACE、COPY、粘贴和选择文本工作。如果你键入A,1-9等,这些键就不会出现.
我已经浏览过网络,并且听说过ElementHost.EnableModelessKeyboardInterop(),但是这只适用于从表单创建的Windows。我只创建WPF UserControls并将它们托管在ElementHost控件中。
我看到了一个关于Dispatcher.Run()的帖子,它有点工作,但打破了表单的其余部分:
System.Windows.Threading.Dispatcher.Run();PreviewKeyUp,PreviewKeyDown,KeyUp和KeyDown events都是针对TextBox的,但遗憾的是,TextBox中没有出现任何文本。
我对Windows不太了解,但是使用WinSpector,我注意到没有WM_GETTEXT消息来自TextBox (如果它们应该是,我也不知道)。
我还创建了一个新的Windows窗体项目,并在其中执行了相同的操作,并且工作正常,所以在Rhino3D引擎中如何创建和停靠窗口肯定是个问题。
下面是不起作用的示例代码:
ElementHost el = new ElementHost();
System.Windows.Controls.TextBox t = new System.Windows.Controls.TextBox();
t.Width = 100;
t.Text = "TEST";
el.Child = t;
panel1.Controls.Add(el);发布于 2009-05-07 19:58:29
头撒了两天我终于想出来了.
MFC对话框窗口接收WM_CHAR消息,并阻止控件处理输入。因此,为了防止这种情况,我将WM_GETDLGCODE挂起,每当我接收到HwndSource消息时,我就会返回要接受的输入类型,然后将事件标记为已处理。
我创建了自己的TextBox,以避免不得不修复每个文本框(参见下面):
/// <summary>
/// Interop Enabled TextBox : This TextBox will properly handle WM_GETDLGCODE Messages allowing Key Input
/// </summary>
class IOTextBox : TextBox
{
private const UInt32 DLGC_WANTARROWS = 0x0001;
private const UInt32 DLGC_WANTTAB = 0x0002;
private const UInt32 DLGC_WANTALLKEYS = 0x0004;
private const UInt32 DLGC_HASSETSEL = 0x0008;
private const UInt32 DLGC_WANTCHARS = 0x0080;
private const UInt32 WM_GETDLGCODE = 0x0087;
public IOTextBox() : base()
{
Loaded += delegate
{
HwndSource s = HwndSource.FromVisual(this) as HwndSource;
if (s != null)
s.AddHook(new HwndSourceHook(ChildHwndSourceHook));
};
}
IntPtr ChildHwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_GETDLGCODE)
{
handled = true;
return new IntPtr(DLGC_WANTCHARS | DLGC_WANTARROWS | DLGC_HASSETSEL);
}
return IntPtr.Zero;
}
}发布于 2009-05-08 13:30:49
看看我自己关于这件事的问题。然而,最终,你所需要的只是这样的东西:
Window window1 = new Window();
ElementHost.EnableModelessKeyboardInterop(window1);
window1.Show();发布于 2011-03-15 16:58:56
对于wxWidgets父窗口和嵌入式WPF TextBox控件,我也有类似的问题。我发现,虽然附加ChildHwndSourceHook确实解决了不接收键盘输入的问题,但我还是偶尔出现了重复的空格字符。WM_KEYDOWN消息似乎可靠地处理空间字符,但也会收到一些空格的重复WM_CHAR消息。为了解决这个问题,我在ChildHwndSourceHook函数的主体中添加了以下子句,它忽略了WM_CHAR空间字符:
const UInt32 WM_CHAR = 0x0102;
if (msg == WM_CHAR)
{
// avoid duplicated spaces when parent window is a native window
if (wParam.ToInt32() == 32)
handled = true;
}https://stackoverflow.com/questions/835878
复制相似问题