我试着把 keys 扣钩住.按下数字锁定键和大写锁定键时显示一个窗口,并在窗口中显示当前锁定键的状态.当我试图快速单击数字锁定键或大写锁定键时,它将在100.Visual Studio显示101中崩溃.
这是100崩溃时的代码:
static void Main(string[] args)
{
XamlCheckProcessRequirements();
global::WinRT.ComWrappersSupport.InitializeComWrappers();
global::Microsoft.UI.Xaml.Application.Start((p) => {
var context = new global::Microsoft.UI.Dispatching.DispatcherQueueSynchronizationContext(global::Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread());
global::System.Threading.SynchronizationContext.SetSynchronizationContext(context);
new App();
});
}
我认为这次崩溃似乎是因为TextBlock文本的快速更 retrofit 成的.
这是100:
<Page
x:Class="MoreFlyout.Views.FlyoutPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:MoreFlyout.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<AcrylicBrush x:Key="CustomAcrylicBrush" AlwaysUseFallback="False" />
</Page.Resources>
<Page.ContextFlyout>
<Flyout x:Name="FlyoutWindowContextFlyout" ShouldConstrainToRootBounds="False">
<Flyout.SystemBackdrop>
<local:AcrylicSystemBackdrop />
</Flyout.SystemBackdrop>
<Flyout.FlyoutPresenterStyle>
<Style BasedOn="{StaticResource DefaultFlyoutPresenterStyle}" TargetType="FlyoutPresenter">
<Setter Property="Background" Value="Transparent" />
</Style>
</Flyout.FlyoutPresenterStyle>
<Grid
x:Name="ContentArea"
MinWidth="164"
Padding="-8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="48" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<HyperlinkButton
x:Name="IconButton"
Grid.Column="0"
Width="32"
Height="32"
IsEnabled="False">
<FontIcon
x:Name="StatusFontIcon"
Margin="-4"
FontSize="12"
Foreground="White"
Glyph="" />
</HyperlinkButton>
<TextBlock
x:Name="StatusTextBlock"
Grid.Column="1"
VerticalAlignment="Center"
TextAlignment="Center" />
</Grid>
</Flyout>
</Page.ContextFlyout>
</Page>
这是100:
using System.Diagnostics;
using System.Runtime.InteropServices;
using Microsoft.UI.Composition;
using Microsoft.UI.Composition.SystemBackdrops;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using MoreFlyout.Helpers;
using MoreFlyout.ViewModels;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.UI.WindowsAndMessaging;
namespace MoreFlyout.Views;
public sealed partial class FlyoutPage : Page
{
private readonly Microsoft.UI.Dispatching.DispatcherQueue dispatcherQueue;
private static System.Timers.Timer? aTimer;
private UnhookWindowsHookExSafeHandle HookID;
private const int WM_KEYDOWN = 0x0100;
private const int VK_NUMLOCK = 0x90;
private const int VK_CAPSLOCK = 0x14;
private static bool numKeyState = false;
private static bool capsKeyState = false;
public FlyoutViewModel ViewModel
{
get;
}
public FlyoutPage()
{
ViewModel = App.GetService<FlyoutViewModel>();
InitializeComponent();
dispatcherQueue = Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread();
numKeyState = (PInvoke.GetKeyState(VK_NUMLOCK) & 1) == 1;
capsKeyState = (PInvoke.GetKeyState(VK_CAPSLOCK) & 1) == 1;
HookID = PInvoke.SetWindowsHookEx(WINDOWS_HOOK_ID.WH_KEYBOARD_LL, HookCallback, null, 0);
App.FlyoutWindow.Closed += FlyoutWindowClosed;
}
private void FlyoutWindowClosed(object sender, WindowEventArgs args) => HookID.Close();
private LRESULT HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0 && wParam == WM_KEYDOWN)
{
var vkCode = Marshal.ReadInt32(lParam);
if (vkCode == VK_NUMLOCK)
{
StatusTextBlock.Text = numKeyState ? "StatusWords_NumUnlock".GetLocalized() : "StatusWords_NumLock".GetLocalized();
StatusFontIcon.Glyph = numKeyState ? "\uE785" : "\uE72E";
numKeyState = !numKeyState;
}
else if (vkCode == VK_CAPSLOCK)
{
StatusTextBlock.Text = capsKeyState ? "StatusWords_CapsUnlock".GetLocalized() : "StatusWords_CapsLock".GetLocalized();
StatusFontIcon.Glyph = capsKeyState ? "\uE785" : "\uE72E";
capsKeyState = !capsKeyState;
}
if(FlyoutWindowContextFlyout.IsOpen == false) FlyoutWindowContextFlyout.ShowAt(this);
}
return PInvoke.CallNextHookEx(null, nCode, wParam, lParam);
}
我试着在try catch中加入StatusTextBlock.Text = numKeyState ? "StatusWords_NumUnlock".GetLocalized() : "StatusWords_NumLock".GetLocalized();
个,但没有任何变化,仍然显示一个关于"系统"的崩溃.执行不例外".
我将这些NuGet用于核心代码:
- Microsoft.Windows.CsWin32版本:0.3.49—beta
- Microsoft. WindowsAppSDK版本:1.5.240311000