只要用户通过组合键更改键盘布局,以下程序就会重复锁定.如果通过托盘小程序更改键盘布局,它不会锁定.将布局更改为英语时,它不会锁定.如果Task从不执行,它不会锁定.
XAML:
<StackPanel>
<TextBox></TextBox>
<Button Click="Button_Click">Click me</Button>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
C#:
private void Button_Click(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
var visual = new DrawingVisual();
using (var context = visual.RenderOpen())
{
}
});
}
Run Code Online (Sandbox Code Playgroud)
在按钮单击之前,我可以随意切换键盘布局.点击后,程序会在第一次尝试切换布局时锁定.
重要的是,只有通过Alt+ Shift+ 2或Ctrl+ Shift+ 2(和3,但不是1)切换布局时,才会出现此错误.
这样做,为时已晚,无法避免使用DrawingVisual后台线程.这已成为该产品不可或缺的核心功能.关于如何解决这个问题的任何想法都是非常受欢迎的.
此错误在.NET 4.0,Win7 32位和64位上重现.
赏金:这个bug在百分比方面影响很少的人,但它确实影响的那些每次他们习惯性地通过快捷方式改变键盘布局时会不断导致锁定(伴随相应的数据丢失).我想要一个解决方法,它不会改变一些视觉效果在一个单独的线程上呈现的事实.
我正在编写一个应用程序,当应用程序本身没有聚焦时,我需要更改系统的语言.我担心这样做的唯一方法就是使用我目前无法完全理解的Windows钩子.有什么想法吗?
编辑:解决方案
[DllImport("user32.dll")]
private static extern bool PostMessage(int hhwnd, uint msg, IntPtr wparam, IntPtr lparam);
[DllImport("user32.dll")]
private static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags);
private static uint WM_INPUTLANGCHANGEREQUEST = 0x0050;
private static int HWND_BROADCAST = 0xffff;
private static string en_US = "00000409";
private static uint KLF_ACTIVATE = 1;
private static void ChangeLanguage()
{
PostMessage(HWND_BROADCAST,WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero ,LoadKeyboardLayout(en_US,KLF_ACTIVATE));
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个用于与网络协议通信的接口,但IEEE文档描述了位级别的协议,信息分割为单个字节.
处理C typedef的最佳方法是什么?
typedef struct {
Nibble transportSpecific;
Enumeration4 messageType;
UInteger4 versionPTP;
UInteger16 messageLength;
UInteger8 domainNumber;
Octet flagField[2];
Integer64 correctionfield;
PortIdentity sourcePortIdentity;
UInteger16 sequenceId;
UInteger8 controlField;
Integer8 logMessageInterval;
} MsgHeader;
Run Code Online (Sandbox Code Playgroud)
何时将兼容层移植到.Net?
我在 Windows 设置中设置了两种语言 - 捷克语(默认)和英语(用于编程)。我想在powershell 中在它们之间切换。
我通常使用捷克语工作,这是我 PC 上的默认语言。因此,每当我(重新)启动任何应用程序时,它都会以捷克语键盘布局开始。
但我正在用英文布局编程。所以当我开始新的编程应用程序时,我总是需要点击 Alt+Shift - 即 powershell 窗口。
有没有办法用powershell中的一些命令来做到这一点?或者在 C# 中,可能通过一些 win32 api 调用(因为我可以为此制作自己的小 cmdlet)?
我发现了这个问题(和其他一些问题),但我不太了解它(他们)...
我从来没有使用过 Win API,所以我不知道什么是可能的以及如何使用它......
有人有一些 cmdlet 或小教程如何做到这一点吗?