public static class Util1
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int GetFocus();
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, int wMsg, int wParam, int lParam);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetClassName(int hWnd, StringBuilder lpClassName, int nMaxCount);
}
public static class Util1S
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, int wMsg, int wParam, string lpData);
}
public static class Util1SB
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, int wMsg, int wParam, System.Text.StringBuilder lpData);
}
4条答案
按热度按时间fd3cxomn1#
有一个小的解决方法。在调用
ShowDialog()
之前在下面一行。示例:
更多信息:
.NET 4.5 WPF RibbonWindow broken in VS2012
ctrmrzij2#
这里是另一个解决方案,你可以使用更复杂的Win32 API函数来访问文件名组合框,并做任何你想做的事情,但这个解决方案使用
SendKeys
,我没有时间在这个时候深入研究Win32 API函数:我不能解释这个错误,但有一些工作区,上面的一个是其中之一。
u5rb5r593#
King King的回答似乎是最好的解决方案,我基本上使用了相同的方法,但可能更简单一点(显然我没有直接在他的帖子上投票或评论的声誉):
lskq00tm4#
我不敢相信没有解决办法最初,它似乎陷入了两个微软小组之间的裂缝,并且使用旧的丑陋对话框的解决方案被接受。也许那时支持从WinForms切换,但WinForms更适合我。我的解决方案很复杂,但我可能会保留它。
我不喜欢使用Sendkeys,因为键是排队的,可能会被另一个窗口拾取。使用假设对话框准备就绪的计时是麻烦的。这个解决方案试图解决这些问题,并在负载沉重的PC上运行时表现出一定的鲁棒性。它可能会更优雅地完成。
一些进口(有更好的方法吗?):
代码使用Win32 API调用来验证包含文件名的实际编辑控件的句柄,并在滚动几乎正确到字符的一小部分(m被截断为n)的情况下替换其中的文本。重试使用一小段时间来尝试修复。我的其他在线建议尝试和我自己的尝试都被注解掉了: