c # - Skift EnableDesktopModeAutoInvoke registreringsværdi og lav TabTip.exe for at acceptere ændring

Indlæg af Hanne Mølgaard Plasc

Problem



Windows 10 har indstilling 'Vis tastaturet, når det ikke er i tablet-tilstand, og der er ingen tastatur tilsluttet', som gør det muligt for Windows at vise touch-tastaturet, når du rører ved tekstfeltet.


Da Windows håndterer denne logik temmelig dårligt (det er let brudt i WPF-applikationer), vil jeg gerne lukke denne indstilling til min ansøgning, som jeg forsøger at gøre ved at ændre registreringsværdi EnableDesktopModeAutoInvoke svarende til denne mulighed (simpel Registry.SetValue metode. Men der er et problem - touch tastaturapplikation TabTip.exe af en eller anden grund gør det ikke rigtigt 'hook up' ændringer i registreringsdatabasen og holder displaytastaturet nede, indtil det genstartes. Og omvendt - når jeg har genoprettet registreringsværdien, skal jeg genstarte applikationen for at kunne anvende ændring.


Og det er her, hvor hovedproblemet med en sådan tilgang vises - med automatisk aktivering er aktiveret, når TabTip-processen starter, viser den straks tastaturet. Selvfølgelig vil jeg ikke lide sådanne visuelle bivirkninger for min applikationslogik.


Et andet punkt er, at mens du ændrer denne indstilling på sædvanlig måde, genstartes ikke TabTip eller andre relaterede applikationer eller tjenester via Windows Settings-programmet. Hvilket betyder, at indstillinger applikationen på en eller anden måde klarer at opdatere TabTip-processen. Jeg vil virkelig gerne regne med, hvordan det gør det, og hvis jeg kan reproducere samme adfærd i C #, men jeg har ingen idé om hvordan.


Så, mit spørgsmål er - hvordan kan jeg programmatisk ændre EnableDesktopModeAutoInvoke registreringsværdi eller 'Vis tastaturet, når det ikke er i tabletmodus, og der er ingen tastaturtilhæftet' Windows-indstilling og gøre TabTip-programmet til at acceptere denne ændring, uden mulige visuelle bivirkninger?


UPD:


Jeg ved, at det er muligt at lave tastaturet for at ignorere tekstboksen ved at oprette brugerdefineret tekstboks med specifikke automatiseringspædagoger, men det ville kræve at erstatte alle tekstbokse i hele applikationen og altid huske på, at vi skal bruge nye tekstbokse, så det er ikke en levedygtig løsning. Jeg har forsøgt at fjerne muligheden for at få automatiseringskammerater til børn i hovedvinduet også, men det virker ikke.

Bedste reference


Så jeg kiggede på mange forskellige implementeringer af det samme


https://github.com/maximcus/WPFTabTip/blob/65b58e1900d3c21c9ea684e9f882088fe821586b/WPFTabTip/TabTip.cs[14]


https://github.com/zhangtx2812/NewClient/blob/851f6dd8bc9c6389b70c7b5cd9384617a62a274e/Client.Helpers/Utils/KeyboardHelper.cs[15]


https://github.com/Anneliese1989/Examintion/blob/2f974312d1ce0452a018bcaecf7bda753c818d9e/WPFTabTip/TabTip.cs[16]


https://github.com/TransposonY/GestureSign/blob/11395ba6f18ea39b86f8e0a586b10a43f3c27568/GestureSign.CorePlugins/TouchKeyboard/TouchKeyboardUI.xaml.cs[17]


https://github.com/microdee/mp.essentials/blob/d5832dee693839d55157d287d2459760b90b1d05/windows/WindowsLaunchOSKNode.cs[18]


og de fleste tilfælde dræber processen processen ved hjælp af


foreach (Process tabTipProcess in Process.GetProcessesByName(TabTipProcessName))
    tabTipProcess.Kill();


eller luk tastaturet ved hjælp af


void closeKeyboard()
{
    uint WM\_SYSCOMMAND = 274;
    uint SC\_CLOSE = 61536;
    IntPtr KeyboardWnd = FindWindow("IPTip\_Main\_Window", null);
    PostMessage(KeyboardWnd.ToInt32(), WM\_SYSCOMMAND, (int)SC\_CLOSE, 0);
}


Så jeg tror, ​​hvad du allerede har, er de bedste valg, der er kendt

Andre referencer 1


Jeg har et skud i mørket for dig ...


Her er en måde, at det er muligt TabTip er underrettet om registreringsændringer ved hjælp af Windows Indstillinger, men ikke af dig: Hvis TabTip bruger internt som WMI RegistryKeyChangeEvent-klassen internt, er det muligt, at TabTip-applikationen kun overvåger den overordnede registreringsnøgle og ikke overvåger den nøgleværdi, du faktisk ændrer (hvorfor TapTip ikke opdateres, når du ændrer værdien). Men Windows Settings-programmet kunne indstille hele key (og det svarer til valueName og value) via noget som SetExpandedStringValue, hvilket ville udløse den nøgleændring, som TabTip kunne se. [19] [20]


Måden at teste for dette ville være at indstille key, valueName og value på én gang programmatisk, i stedet for blot at indstille value.

Andre referencer 2


Ikke en god løsning, men du kan forsøge at koble dig til den viste hændelse https://docs.microsoft.com/en-us/uwp/api/windows.ui.viewmanagement.inputpane[21]


Og straks ringe til et TryHide i tilfælde af en showhændelse for at undertrykke den.