【问题标题】:Programmatically Launching Windows 10 Emoji Hotkeys以编程方式启动 Windows 10 表情符号热键
【发布时间】:2018-04-08 07:19:04
【问题描述】:

Windows 10 的最新主要更新“秋季创作者更新”(AKA RedStone3) 具有可在任何文本框中使用的 added the functionality of a system-wide emoji pop-up

我正在尝试制作一个程序,该程序会在单击按钮时启动相同的弹出式表情符号窗口。正如another discussion 中关于类似主题的建议,我尝试使用InputSimulator 项目。还有其他方法,建议here,但似乎那个模拟器很好地包装了它们。

我所做的只是创建一个新的小型 WPF 应用程序,其中有一个主窗口,其中包含一个文本框和一个按钮。按下按钮将运行以下代码:

textBox.Focus()
new InputSimulator().Keyboard.ModifiedKeyStroke(VirtualKeyCode.LWIN, VirtualKeyCode.OEM_PERIOD);

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

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

【问题讨论】:

  • 请注意,由于某些奇怪的原因,表情符号噱头仅适用于美国键盘映射。
  • @JonathanPotter 之前没有注意到这一点,谢谢!当然,虽然我已经在英文键盘上尝试过上述代码。
  • 请注意,在更新到 RS4(2018 年 4 月)之后,表情符号热键现在应该可以在所有语言中使用

标签: c# wpf winforms input emoji


【解决方案1】:

在 Windows 窗体或 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 FormsWPF项目,在使用上述代码之前,你 需要配置你的项目才能call Windows Runtime APIs in desktop apps

在 Windows 窗体或 WPF 中调用 Windows 运行时 API

.NET 5

  1. 解决方案资源管理器→右键单击您的项目→选择编辑项目文件。

  2. TargetFramework 的值更改为以下字符串之一并保存更改。

    • net5.0-windows10.0.17763.0:针对 Windows 10 版本 1809。
    • net5.0-windows10.0.18362.0:针对 Windows 10 版本 1903。
    • net5.0-windows10.0.19041.0:针对 Windows 10 2004 版。

    例如:

    <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
  • 很可能是这种情况,CoreInputViewKind 的 commit history 显示了 2018 年 6 月的第一个有用提交。感谢您的反馈,我在发布之前已经测试了 .NET 5 和 .NET 4.8答案。
【解决方案2】:

由于无法让这些更优雅的解决方案发挥作用,我求助于键盘调用。这很适合我的需求,所以我想我会分享。

 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 是一个标签,您不想使用按钮,因为它会改变焦点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2013-05-22
    • 2011-10-03
    • 2016-03-09
    相关资源
    最近更新 更多