cortana own command in backgroundtask - c#
i am trying to write an c# programm to define custom commands for cortana!
First of all i create an default app-application and load the VCD file...
I create a second project link this to the main project and create inside this a backgroundtask to handle the cortana requests!
Now cortana know my commands, but if i tell her something she is answering "Es ist etwas schief gelaufen" (in english: "it fails").
I think the BackgroundTask is not correctly called.
App.cs
namespace CortanaCommandsStart
{
/// <summary>
/// Stellt das anwendungsspezifische Verhalten bereit, um die Standardanwendungsklasse zu ergänzen.
/// </summary>
sealed partial class App : Application
{
/// <summary>
/// Initialisiert das Singletonanwendungsobjekt. Dies ist die erste Zeile von erstelltem Code
/// und daher das logische Äquivalent von main() bzw. WinMain().
/// </summary>
public App()
{
Microsoft.ApplicationInsights.WindowsAppInitializer.InitializeAsync(Microsoft.ApplicationInsights.WindowsCollectors.Metadata | Microsoft.ApplicationInsights.WindowsCollectors.Session);
this.InitializeComponent();
this.Suspending += OnSuspending;
}
/// <summary>
/// Wird aufgerufen, wenn die Anwendung durch den Endbenutzer normal gestartet wird. Weitere Einstiegspunkte
/// werden z. B. verwendet, wenn die Anwendung gestartet wird, um eine bestimmte Datei zu öffnen.
/// </summary>
/// <param name="e">Details über Startanforderung und -prozess.</param>
protected override async void OnLaunched(LaunchActivatedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
// App-Initialisierung nicht wiederholen, wenn das Fenster bereits Inhalte enthält.
// Nur sicherstellen, dass das Fenster aktiv ist.
if (rootFrame == null)
{
// Frame erstellen, der als Navigationskontext fungiert und zum Parameter der ersten Seite navigieren
rootFrame = new Frame();
rootFrame.NavigationFailed += OnNavigationFailed;
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: Zustand von zuvor angehaltener Anwendung laden
}
// Den Frame im aktuellen Fenster platzieren
Window.Current.Content = rootFrame;
}
if (rootFrame.Content == null)
{
// Wenn der Navigationsstapel nicht wiederhergestellt wird, zur ersten Seite navigieren
// und die neue Seite konfigurieren, indem die erforderlichen Informationen als Navigationsparameter
// übergeben werden
rootFrame.Navigate(typeof(MainPage), e.Arguments);
}
try {
StorageFile vcdStorageFile = await Package.Current.InstalledLocation.GetFileAsync(#"LEDControll.xml");
await VoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync(vcdStorageFile);
System.Diagnostics.Debug.WriteLine("There was no error registering the Voice Command Definitions");
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("There was an error registering the Voice Command Definitions", ex);
}
// Sicherstellen, dass das aktuelle Fenster aktiv ist
Window.Current.Activate();
}
/// <summary>
/// Wird aufgerufen, wenn die Navigation auf eine bestimmte Seite fehlschlägt
/// </summary>
/// <param name="sender">Der Rahmen, bei dem die Navigation fehlgeschlagen ist</param>
/// <param name="e">Details über den Navigationsfehler</param>
void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
}
/// <summary>
/// Wird aufgerufen, wenn die Ausführung der Anwendung angehalten wird. Der Anwendungszustand wird gespeichert,
/// ohne zu wissen, ob die Anwendung beendet oder fortgesetzt wird und die Speicherinhalte dabei
/// unbeschädigt bleiben.
/// </summary>
/// <param name="sender">Die Quelle der Anhalteanforderung.</param>
/// <param name="e">Details zur Anhalteanforderung.</param>
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Anwendungszustand speichern und alle Hintergrundaktivitäten beenden
deferral.Complete();
}
}
}
Appxmanifest:
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" IgnorableNamespaces="uap mp">
<Identity Name="32ed3ec5-2e4a-4517-ae2b-842653ab8a8e" Publisher="CN=Flo" Version="1.0.0.0" />
<mp:PhoneIdentity PhoneProductId="32ed3ec5-2e4a-4517-ae2b-842653ab8a8e" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
<Properties>
<DisplayName>CortanaCommandsStart</DisplayName>
<PublisherDisplayName>Flo</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="CortanaCommandsStart.App">
<uap:VisualElements DisplayName="CortanaCommandsStart" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="CortanaCommandsStart" BackgroundColor="transparent">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png">
</uap:DefaultTile>
<uap:SplashScreen Image="Assets\SplashScreen.png" />
</uap:VisualElements>
<Extensions>
<uap:Extension Category="windows.appService" EntryPoint="CortanaCommand.CortanaCommandService">
<uap:AppService Name="CortanaCommandService" />
</uap:Extension>
</Extensions>
</Application>
</Applications>
</Package>
CortanaCommand.cs
namespace CortanaCommand
{
public sealed class CortanaCommandService : IBackgroundTask
{
private VoiceCommandServiceConnection voiceServiceConnection;
private BackgroundTaskDeferral _deferral;
public async void Run(IBackgroundTaskInstance taskInstance)
{
_deferral = taskInstance.GetDeferral();
voiceServiceConnection.VoiceCommandCompleted += VoiceCommandCompleted;
AppServiceTriggerDetails triggerDetails = taskInstance.TriggerDetails as AppServiceTriggerDetails;
if (triggerDetails != null && triggerDetails.Name.Equals("CortanaCommandService"))
{
try
{
voiceServiceConnection = VoiceCommandServiceConnection.FromAppServiceTriggerDetails(triggerDetails);
VoiceCommand voiceCommand = await voiceServiceConnection.GetVoiceCommandAsync();
// Perform the appropriate command depending on the operation defined in VCD
VoiceCommandUserMessage userMessage = new VoiceCommandUserMessage();
switch (voiceCommand.CommandName)
{
case "LedChangeColor":
var destination = voiceCommand.Properties["color"][0];
SendCompletionMessageForDestination(destination);
break;
default:
LaunchAppInForeground();
break;
}
}
finally
{
_deferral.Complete();
}
}
}
private void VoiceCommandCompleted(VoiceCommandServiceConnection sender, VoiceCommandCompletedEventArgs args)
{
if (this._deferral != null)
{
this._deferral.Complete();
}
}
private async void SendCompletionMessageForDestination(string destination)
{
// Take action and determine when the next trip to destination
// Inset code here
// Replace the hardcoded strings used here with strings
// appropriate for your application.
// First, create the VoiceCommandUserMessage with the strings
// that Cortana will show and speak.
var userMessage = new VoiceCommandUserMessage();
userMessage.DisplayMessage = "Here’s your trip.";
userMessage.SpokenMessage = "Your trip to Vegas is on August 3rd.";
// Optionally, present visual information about the answer.
// For this example, create a VoiceCommandContentTile with an
// icon and a string.
var destinationsContentTiles = new List<VoiceCommandContentTile>();
// Create the VoiceCommandResponse from the userMessage and list
// of content tiles.
var response = VoiceCommandResponse.CreateResponse(userMessage, destinationsContentTiles);
// Ask Cortana to display the user message and content tile and
// also speak the user message.
await voiceServiceConnection.ReportSuccessAsync(response);
}
private async void LaunchAppInForeground()
{
var userMessage = new VoiceCommandUserMessage();
userMessage.SpokenMessage = "Launching Adventure Works";
var response = VoiceCommandResponse.CreateResponse(userMessage);
// When launching the app in the foreground, pass an app
// specific launch parameter to indicate what page to show.
response.AppLaunchArgument = "showAllTrips=true";
await voiceServiceConnection.RequestAppLaunchAsync(response);
}
}
}
VCD:
<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.2">
<CommandSet xml:lang="de-de" Name="LEDControll">
<CommandPrefix>LED</CommandPrefix>
<Example>Steuere die LEDs</Example>
<Command Name="LedChangeColor">
<Example>LED Farbe grün</Example>
<ListenFor>farbe {color}</ListenFor>
<Feedback>Farbe wird geändert in {color}</Feedback>
<VoiceCommandService Target="CortanaCommandService"/>
</Command>
<PhraseList Label="color">
<Item> grün </Item>
<Item> blau </Item>
<Item> rot </Item>
</PhraseList>
</CommandSet>
</VoiceCommands>
Thank you, for your help!
Just adding the answer here so it's clear:
To ensure that the background task is added to the App Package properly, you can add a reference from the startup project to the background task project within VS:
Right click on references in the startup project
Go to Add Reference
Select "Projects" on the left
Tick the box next to the project containing the background task.
Hit OK.
This ensures that VS will build and copy the background task into the package when you go to deploy it. Otherwise, you run into difficult to debug problems like this.
Typically you can tell this has happened when you've triple-checked that the Package manifest uap:Extension entry has the right details, but can't get a breakpoint to hit in the background task when you try to activate it. I'll also check to see if there are any event log type entries that can be looked up to see this more easily.
Related
How to capture everything in a string into separate groups in C#? [duplicate]
This question already has answers here: Get text between 2 html tags c# (3 answers) Closed 3 years ago. I have some data in a file and I am using Regex to get individual elements and remove all the \r\n between the <opening> and </closing> tags. But when i am trying to select the elements separately, at the end, the whole data is getting selected as one group. This is my Regex: (<([ph0-9figc]+)>)([a-zA-Z0-9äöüÄÖÜß[:punct:] \n\r\t])+(<\/\2>) Sample with Input Data
It may not be the best idea to do this task with regular expressions, especially for replacing new lines. If we really have to, we might want to capture those tags one by one. For instance, this expression only captures the p tags using three capturing groups (): (<p>)([\s\S]*?)(<\/p>) regex101.com. RegEx Circuit We can also visualize your expressions in jex.im: JavaScript Demo const regex = /(<p>)([\s\S]*?)(<\/p>)/gm; const str = `<p> <st>Liebe stern-Redaktion, </st> <i>Liebe stern-Redaktion,</i> warum schreiben Sie nicht, was wirklich freitags whrend der Protest-Demos am Grenzzaun passiert? Wie die Familien der Mrder fr jede gettete jdische Person belohnt werden? Oder ber die Feuerballons, die aus dem Gazastreifen in den Sden Israels geschickt werden? Brita Singh, Scheeel</p> <fig> <img src="images/img_8-1.jpg" width="596" height="428" alt="" /> <fc> <i>stern</i> Nr. 10/2019, Bild der Woche: Kindertrauer im Gazastreifen</fc> </fig> <p> <i>Sehr geehrte Frau Singh,</i> bei Demonstrationen am Grenzzaun starben laut Bericht der UN-Kommission in neun Monaten 35 Kinder durch Schüsse israelischer Soldaten. Zwei Journalisten und drei Sanitäter wurden erschossen, über 6000 Menschen verletzt. Israel hat gerade Ermittlungen zu elf der Todesfälle aufgenommen. Dagegen hat es in dem Zeitraum kein israelisches Todesopfer am Grenzzaun zu Gaza gegeben. Die Hamas pflegt einen Märtyrerkult und belohnt Morde mit Geld; israelische Sicherheitskräfte zerstören Häuser von Angehörigen palästinensischer Attentäter. Beides fördert den Hass. Opfer sind Menschen wie das Mädchen auf diesem Bild. Der <i>stern</i> hat keinen einseitigen Blick auf die Komplexität des Nahostkonflikts wir schauen stets auf beide Seiten. <i>Mit freundlichen Grüßen Cornelia Fuchs, Ressortleiterin Ausland</i></p> <p>Eine liebevolle Mutter will, dass ihr Kind glücklich ist, egal, ob sie sein Leben versteht. Alles andere ist Egoismus und keine Mutterliebe. </p> <p>Annemarie Fischer, Wielenbach</p>`; let m; while ((m = regex.exec(str)) !== null) { // This is necessary to avoid infinite loops with zero-width matches if (m.index === regex.lastIndex) { regex.lastIndex++; } // The result can be accessed through the `m`-variable. m.forEach((match, groupIndex) => { console.log(`Found match, group ${groupIndex}: ${match}`); }); } C# Test using System; using System.Text.RegularExpressions; public class Example { public static void Main() { string pattern = #"(<p>)([\s\S]*?)(<\/p>)"; string input = #"<p> <st>Liebe stern-Redaktion, </st> <i>Liebe stern-Redaktion,</i> warum schreiben Sie nicht, was wirklich freitags whrend der Protest-Demos am Grenzzaun passiert? Wie die Familien der Mrder fr jede gettete jdische Person belohnt werden? Oder ber die Feuerballons, die aus dem Gazastreifen in den Sden Israels geschickt werden? Brita Singh, Scheeel</p> <fig> <img src=""images/img_8-1.jpg"" width=""596"" height=""428"" alt="""" /> <fc> <i>stern</i> Nr. 10/2019, Bild der Woche: Kindertrauer im Gazastreifen</fc> </fig> <p> <i>Sehr geehrte Frau Singh,</i> bei Demonstrationen am Grenzzaun starben laut Bericht der UN-Kommission in neun Monaten 35 Kinder durch Schüsse israelischer Soldaten. Zwei Journalisten und drei Sanitäter wurden erschossen, über 6000 Menschen verletzt. Israel hat gerade Ermittlungen zu elf der Todesfälle aufgenommen. Dagegen hat es in dem Zeitraum kein israelisches Todesopfer am Grenzzaun zu Gaza gegeben. Die Hamas pflegt einen Märtyrerkult und belohnt Morde mit Geld; israelische Sicherheitskräfte zerstören Häuser von Angehörigen palästinensischer Attentäter. Beides fördert den Hass. Opfer sind Menschen wie das Mädchen auf diesem Bild. Der <i>stern</i> hat keinen einseitigen Blick auf die Komplexität des Nahostkonflikts wir schauen stets auf beide Seiten. <i>Mit freundlichen Grüßen Cornelia Fuchs, Ressortleiterin Ausland</i></p> <p>Eine liebevolle Mutter will, dass ihr Kind glücklich ist, egal, ob sie sein Leben versteht. Alles andere ist Egoismus und keine Mutterliebe. </p> <p>Annemarie Fischer, Wielenbach</p>"; RegexOptions options = RegexOptions.Multiline; foreach (Match m in Regex.Matches(input, pattern, options)) { Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index); } } }
If you are willing to accept the extra "_" and other white space characters then I simplified your pattern as follows: var pat = #"(<(?'tag'[ph0-9figc]+)>)(?'body'([\wäöüÄÖÜß\p{P}\s])+)(<\/\k'tag'>)"; And the regular expression removing the CR-LF is: var body = m.Groups["body"].Value .Replace(Environment.NewLine, " ") .Replace("\r", " ") .Replace("\n", " "); var tag = m.Groups["tag"].Value; var noCrLf = re.Replace(text, m => $"<{tag}>{body}</{tag}>"); Though looking at your data, I may not have understood what you are after. One of your tags, for example, is not matched by your tag pattern "[ph0-9figc]+". If I did not understand your concern, please straighten me out.
CallbackOnCollectedDelegate in mousekeyhook
I'm using https://github.com/gmamaladze/globalmousekeyhook for a program. The hook fires, but after some time there comes a CallbackOnCollectedDelegate and i don't have the knowledge for changing the code from github. I couldn't transform the help from into my code CallbackOnCollectedDelegate in globalKeyboardHook was detected The failuremessage in Visual Studio (Language German) is: CallbackOnCollectedDelegate ist aufgetreten. Message: Der Assistent für verwaltetes Debugging ""CallbackOnCollectedDelegate"" hat ein Problem in ""C:\Users\Admin\ownCloud\GRANT-ZIM\Code_Grant\Filter\GRANTExample\bin\x64\Debug\GRANTExample.vshost.exe"" festgestellt. Zusätzliche Informationen: Für den von der Garbage Collection gesammelten Delegaten vom Typ "Gma.System.MouseKeyHook!Gma.System.MouseKeyHook.WinApi.HookProcedure::Invoke" wurde ein Rückruf durchgeführt. Dies kann Anwendungsabstürze, Datenbeschädigung und -verlust zur Folge haben. Beim Übergeben von Delegaten an nicht verwalteten Code müssen die Delegaten von der verwalteten Anwendung beibehalten werden, bis sichergestellt ist, dass sie nie aufgerufen werden. The used code is: private IKeyboardMouseEvents m_GlobalHook; public void Subscribe() { m_GlobalHook = Hook.GlobalEvents(); m_GlobalHook.MouseDownExt += GlobalHookMouseDownExt; m_GlobalHook.KeyUp += OnKeyUp; }
Why does this XSD-validation lead to an error
I've got an XSD to validate a XML-file before importing it into an other program. It worked already for 1 week. But yesterday the validation failed an I don't know why. The error occurs at the validation of the email-adress. This is the validation of the email-adress in the XSD-file: <simpleType name="EMailAdressType"> <annotation> <documentation></documentation> </annotation> <restriction base="string"> <pattern value="\w+([-+.']\w+)*#\w+([-.]\w+)*\.\w+([-.]\w+)*"> </pattern> <minLength value="0"></minLength> <maxLength value="64"></maxLength> <pattern value="\s*"></pattern> </restriction> </simpleType> And this is my C#-methode to validate a XML-file against a XSD-file: public static List<string> ValidateXMLAgainstXSD(string xmlPath, string xsdPath, string targetNamespace) { /// Rückgabeliste für die Validierungsfehler List<string> validationErrors = new List<string>(); /// Klasse für die XML-Schemas (XSD-Dateien) XmlSchemaSet schemas = new XmlSchemaSet(); /// Neues XML-Schema hinzufügen schemas.Add(targetNamespace, xsdPath); /// Das XML-Dokument, das validiert werden soll XDocument custOrdDoc = XDocument.Load(xmlPath); /// Validierungs-Vorgang custOrdDoc.Validate(schemas, (o, e) => { validationErrors.Add(e.Message); }); /// Validierungsfehlerliste zurück geben return validationErrors; } The error-message is (translated by myself from german to english): This element 'EMailAdress' is not valid - The value 'mayer_johann75#web.de' is because of his datatype 'http://www.abcde.de/mhr/applicants/:EMailAdressType' not valid -- Pattern-restriction failed.. When I take the Pattern from the XSD-file and try the validation from the email-adress-string directly with the Regex-Class then it is valid... What is wrong?
As pointed out by the earlier comments, .Net interprets \w differently to w3c. For .Net its equivalent to [a-zA-Z0-9_] whereas for XSD schemas, the \w option doesn't include the underscore. Just replace all those \w with [A-Za-z0-9_] and everything should be fine.
Obscured and Unobscured event. Error
I try to write an Obscured and Unobscured event, but there is one Error in: PhoneApplicationFrame phoneAppRootFrame = (Application.Current as App).RootFrame error: Auf den Member 'Timer.App.RootFrame.get' kann nicht mit einem Instanzenverweis zugegriffen werden. Qualifizieren Sie ihn stattdessen mit einem Typnamen. The Error is in German, because I'm using the German Version of Visual Studio How I can solve the problem? EDIT: code: PhoneApplicationFrame phoneAppRootFrame = (Application.Current as App).RootFrame; phoneAppRootFrame.Obscured += OnObscured; phoneAppRootFrame.Unobscured += Unobscured;
CallbackOnCollectedDelegate error when using OpenFileDialog
I would like to add an OpenFileDialog to my application. The dialog opens as expected but as soon as I close the dialog I get an error regarding "CallbackOnCollectedDelegate". I looked for OpenFileDialog examples on the web but they do not look much different from my code. Also I looked at solutions for the "CallbackOnCollectedDelegate" error here on stackoverflow but unfortunately I do not see the point where my code fails. I am using a similar constructions to open other self created dialog boxes in my program - without problems. This is the first time I try to use a predefined Dialog and maybe I am doing something strange here? OpenFileDialog Dialog_OpenFile; private void OpenFileButton_Click(object sender, EventArgs e) //open file { if (Dialog_OpenFile == null) //only create once { Dialog_OpenFile = new OpenFileDialog(); Dialog_OpenFile.InitialDirectory = "."; Dialog_OpenFile.RestoreDirectory = false; Dialog_OpenFile.Multiselect = false; Dialog_OpenFile.Filter = "OpenOffice (*.ods)|*.ods|Microsoft Excel (*.xlsx)|*.xlsx"; Dialog_OpenFile.FilterIndex = 2; } DialogResult status = Dialog_OpenFile.ShowDialog(); if (status == DialogResult.OK) { ...do something... } } I have added the error message I get (unfortunately in German but the most important parts should be understandable): Der Assistent für verwaltetes Debugging ""CallbackOnCollectedDelegate"" hat ein Problem in ""C:\Users...\Visual Studio 2013\Projects\myprog\myprog\bin\Debug\myprog.vshost.exe"" festgestellt. Zusätzliche Informationen: Für den von der Garbage Collection gesammelten Delegaten vom Typ "System.Windows.Forms!System.Windows.Forms.NativeMethods+WndProc::Invoke" wurde ein Rückruf durchgeführt. Dies kann Anwendungsabstürze, Datenbeschädigung und -verlust zur Folge haben. Beim Übergeben von Delegaten an nicht verwalteten Code müssen die Delegaten von der verwalteten Anwendung beibehalten werden, bis sichergestellt ist, dass sie nie aufgerufen werden. Ein Ausnahmefehler des Typs "System.NullReferenceException" ist in System.Windows.Forms.dll aufgetreten. Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. "myprog.vshost.exe" (CLR v4.0.30319: myprog.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert. Das Programm "[3452] myprog.vshost.exe" wurde mit Code 0 (0x0) beendet.