以编程方式启动Windows 10表情符号快捷键

8
Windows 10的最新重大更新,"秋季创作者更新"(又名RedStone3),已经增加了系统范围内的表情符号弹出功能,可在任何文本框中使用。
我正在尝试制作一个程序,当点击按钮时会启动相同的弹出式表情符号窗口。如另一讨论所建议的那样,我尝试使用InputSimulator项目。还有其他方法,如这里所建议的,但似乎模拟器将它们包装得很好。
我所做的只是创建一个新的小型WPF应用程序,其中包含一个主窗口,其中有一个文本框和一个按钮。按下按钮将运行以下代码:
textBox.Focus()
new InputSimulator().Keyboard.ModifiedKeyStroke(VirtualKeyCode.LWIN, VirtualKeyCode.OEM_PERIOD);

这似乎没有任何影响!我还尝试过OEM_1(即“:;”键码)而不是OEM_PERIOD,但仍然没有运气。问题是,任何其他LWIN与另一个键的组合(例如VK_P)都可以使用相同模拟器的代码。

如果我尝试在真实键盘上按下Emoji热键,在运行该代码后,第一次按下不起作用(有时表情符号弹出窗口会显示半秒钟,然后立即消失),然后需要再次按下热键才能显示弹出窗口。这使我怀疑可能弹出窗口确实显示在屏幕范围之外,或者等待另一个键盘事件发生/完成?


1
请注意,由于某种奇怪的原因,Emoji 技巧仅适用于美国键盘映射。 - Jonathan Potter
@JonathanPotter之前没有注意到,谢谢!当然,我已经在英文键盘上尝试了这段代码。 - Yoav Feuerstein
1
请注意,在更新到RS4(2018年4月)之后,Emoji热键现在应该可以在所有语言中使用。 - Yoav Feuerstein
2个回答

5

在 Windows Forms 或 WPF 应用程序中打开表情符号面板

您需要处理所需的事件,然后首先将 Focus 设置给您的控件,然后使用 CoreInputView.GetForCurrentView 获取当前窗口的核心输入视图,然后调用其 TryShow 方法,并将 CoreInputViewKind.Emoji 传递给该方法。例如:

//using Windows.UI.ViewManagement.Core;
private async void button1_Click(object sender, EventArgs e)
{
    textBox1.Focus();
    CoreInputView.GetForCurrentView().TryShow(CoreInputViewKind.Emoji);
}

在 Windows Forms 或 WPF 中调用 Windows Runtime API

注意: 对于 Windows FormsWPF 项目,在使用上述代码之前,您需要配置您的项目以能够在桌面应用程序中调用 Windows 运行时 API。您可以参考此链接了解如何将桌面应用程序现代化并增强为 UWP

.NET 5

  1. Solution Explorer → Right click on your project → Choose Edit Project File.

  2. Change the value of TargetFramework to one of the following strings and save changes.

    • net5.0-windows10.0.17763.0: for targeting Windows 10, version 1809.
    • net5.0-windows10.0.18362.0: for targeting Windows 10, version 1903.
    • net5.0-windows10.0.19041.0: for targeting Windows 10, version 2004.

    For example:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
      <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>net5.0-windows10.0.18362.0</TargetFramework>
        <UseWindowsForms>true</UseWindowsForms>
      </PropertyGroup>
    </Project>
    

.NET 4.X

  1. 在“工具”菜单中选择“NuGet包管理器”→“包管理器设置”→确保“默认包管理格式”选择了“PackageReference”。

  2. 在“解决方案资源管理器”中,右键单击您的项目→选择“管理NuGet程序包”。

  3. 找到“Microsoft.Windows.SDK.Contracts”程序包。在NuGet包管理器窗口的右侧窗格中,根据您想要针对的Windows 10版本选择所需的软件包版本,然后单击安装:

    • 10.0.19041.xxxx:用于针对Windows 10版本2004。
    • 10.0.18362.xxxx:用于针对Windows 10版本1903。
    • 10.0.17763.xxxx:用于针对Windows 10版本1809。
    • 10.0.17134.xxxx:用于针对Windows 10版本1803。

非常感谢您详细的回答!我现在无法测试它,但是因为它看起来可靠,所以我会接受它 :) 另外,我认为当最初提出这个问题时(3年前),CoreInputViewKind.Emoji还没有被定义。 - Yoav Feuerstein
1
很可能是这样的,CoreInputViewKind的提交历史显示了2018年6月的第一个有用的提交。感谢反馈,我在发布答案之前已经测试了.NET 5和.NET 4.8。 - Reza Aghaei

0

由于我无法让这些更优雅的解决方案起作用,所以我转而使用键盘调用。对于我的需求来说,这个方法完全有效,所以我想分享一下。

 Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As IntPtr, ByVal bScan As IntPtr, ByVal dwFlags As IntPtr, ByVal dwExtraInfo As IntPtr)

 Private Sub EmojiLaunch_Click(sender As Object, e As EventArgs) Handles EmojiLaunch.Click

    Call keybd_event(&H5B, 0, &H0, 0) 'Windows Key Down
    Call keybd_event(&HBE, 0, &H0, 0) 'Period Key Down
    Call keybd_event(&HBE, 0, &H2, 0) 'Period Key Up
    Call keybd_event(&H5B, 0, &H2, 0) 'Windows Key Up

 End Sub

EmojiLaunch是一个标签,你不想使用按钮,因为它会改变焦点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接