Mon application est actuellement en cours d'exécution sur un périphérique de poche exécutant Windows Mobile 6.5. Je veux être en mesure de capturer les pressions de bouton programmable Gauche/Droite dans l'application et amener l'utilisateur au formulaire "maison" ou un autre formulaire qui est fréquemment utilisé dans l'application. Au niveau du système d'exploitation, ces touches programmables sont configurées pour aller respectivement à Calendrier/Contacts, mais à l'intérieur de mon application, j'aimerais que ces boutons fonctionnent comme indiqué ci-dessus. Comment puis-je capturer ou intercepter ces pressions de touches à l'intérieur du Compact Framework? J'ai fait un peu de recherche et j'ai vu quelques références à l'enregistrement d'une Hot Key? Toute aide serait grandement appréciée. Remarque: Mon application utilise un contrôle MainMenu, mais les touches programmables gauche/droite ne contrôlent aucune sélection de menu.Appuyez sur la touche programmable Gauche/Droite - C# .net CF 3.5
3
A
Répondre
2
essayez ceci:
public class HButtons : System.Windows.Forms.Form
{
private MainMenu mainMenu1;
private MenuItem mnuBack;
myMessageWindow messageWindow;
public HButtons()
{
InitializeComponent();
this.messageWindow = new myMessageWindow(this);
RegisterHKeys.RegisterRecordKey(this.messageWindow.Hwnd);
}
protected override void Dispose(bool disposing)
{
RegisterHKeys.UnRegisterRecordKey();
base.Dispose(disposing);
}
public void ButtonPressed(int button)
{
switch (button)
{
case (int)KeysHardware.VK_APP1:
MessageBox.Show("VK_APP1 pressed!");
break;
case (int)KeysHardware.GreenPhoneButton:
MessageBox.Show("GreenPhoneButton pressed!");
break;
case (int)KeysHardware.RedPhoneButton:
MessageBox.Show("RedPhoneButton pressed!");
break;
case (int)KeysHardware.VK_TSOFT1:
MessageBox.Show("VK_TSOFT1 pressed!");
break;
}
}
private void InitializeComponent()
{
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.mnuBack = new System.Windows.Forms.MenuItem();
this.SuspendLayout();
//
// mainMenu1
//
this.mainMenu1.MenuItems.Add(this.mnuBack);
//
// mnuBack
//
this.mnuBack.Text = "Back";
this.mnuBack.Click += new System.EventHandler(this.mnuBack_Click);
//
// HButtons
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
this.ClientSize = new System.Drawing.Size(240, 268);
this.Menu = this.mainMenu1;
this.MinimizeBox = false;
this.Name = "HButtons";
this.Text = "HW buttons";
this.ResumeLayout(false);
}
private void mnuBack_Click(object sender, EventArgs e)
{
this.Close();
}
}
public class myMessageWindow : MessageWindow
{
public const int WM_HOTKEY = 0x0312;
HButtons example;
public myMessageWindow(HButtons anExample)
{
this.example = anExample;
}
protected override void WndProc(ref Message msg)
{
switch (msg.Msg)
{
case WM_HOTKEY:
example.ButtonPressed(msg.WParam.ToInt32());
return;
}
base.WndProc(ref msg);
}
}
public class RegisterHKeys
{
[DllImport("coredll.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd, // handle to window
int id, // hot key identifier
KeyModifiers Modifiers, // key-modifier options
int key //virtual-key code
);
[DllImport("coredll.dll")]
private static extern bool UnregisterFunc1(
KeyModifiers modifiers,
int keyID);
public static void RegisterRecordKey(IntPtr hWnd)
{
UnregisterFunc1(KeyModifiers.Windows, (int)KeysHardware.VK_APP1);
RegisterHotKey(hWnd, (int)KeysHardware.VK_APP1, KeyModifiers.Windows, (int)KeysHardware.VK_APP1);
UnregisterFunc1(KeyModifiers.None, (int)KeysHardware.GreenPhoneButton);
RegisterHotKey(hWnd, (int)KeysHardware.GreenPhoneButton, KeyModifiers.None, (int)KeysHardware.GreenPhoneButton);
UnregisterFunc1(KeyModifiers.None, (int)KeysHardware.RedPhoneButton);
RegisterHotKey(hWnd, (int)KeysHardware.RedPhoneButton, KeyModifiers.None, (int)KeysHardware.RedPhoneButton);
UnregisterFunc1(KeyModifiers.None, (int)KeysHardware.VK_TSOFT1);
RegisterHotKey(hWnd, (int)KeysHardware.VK_TSOFT1, KeyModifiers.None, (int)KeysHardware.VK_TSOFT1);
}
public static void UnRegisterRecordKey()
{
UnregisterFunc1(KeyModifiers.Windows, (int)KeysHardware.VK_APP1);
UnregisterFunc1(KeyModifiers.None, (int)KeysHardware.GreenPhoneButton);
UnregisterFunc1(KeyModifiers.None, (int)KeysHardware.RedPhoneButton);
UnregisterFunc1(KeyModifiers.None, (int)KeysHardware.VK_TSOFT1);
}
}
///// <summary>
///// Summary description for hwButtons.
///// </summary>
//public class hwButtons
//{
// public hwButtons()
// {
// HButtons theBtns = new HButtons();
// }
//}
public enum KeyModifiers
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Windows = 8,
Modkeyup = 0x1000,
}
//public enum KeysHardware : int
//{
// Hardware1 = 193, //0xC1
// Hardware2 = 194,
// Hardware3 = 195,
// Hardware4 = 196,
// Hardware5 = 197
//}
public enum KeysHardware : int
{
VK_F1 = 0x70,
VK_F2 = 0x71,
VK_F3 = 0x72,
VK_F4 = 0x73,
VK_F5 = 0x74,
VK_F6 = 0x75,
VK_F7 = 0x76,
VK_F8 = 0x77,
VK_F9 = 0x78,
VK_F10 = 0x79,
VK_F11 = 0x7A,
VK_F12 = 0x7B,
VK_TSOFT1 = VK_F1, // Softkey 1
VK_TSOFT2 = VK_F2, // Softkey 2
VK_TTALK = VK_F3, // Talk = Green Phone Button
VK_TEND = VK_F4, // End = Red Phone Button
VK_APP1 = 0xC1, // up to 6 other hardware buttons
VK_APP2 = 0xC2,
VK_APP3 = 0xC3,
VK_APP4 = 0xC4,
VK_APP5 = 0xC5,
VK_APP6 = 0xC6,
RedPhoneButton = VK_TEND,
GreenPhoneButton = VK_TTALK
}
0
Normalement, vous ne devez utiliser AllKeys (Vrai) api cal pour capturer toutes les touches.
Mais la solution pour capturer SoftKey1 et SoftKey2 sur WM6.5 est plus compliquée: http://www.hjgode.de/wp/2012/09/20/windows-mobile-cf-how-to-catch-f1-and-f2-in-weh/
Extrait de mon blog il y a:
- L'utilisation d'un Microsoft.WindowsCE.Forms MessageWindow avec un WndProc échoue. [Approche MessageWindow CF]
- L'utilisation de SetWindowLong avec un remplacement WndProc échoue si elle n'est utilisée que sur le handle de formulaire. Mais vous pouvez l'utiliser et l'implémenter pour chaque élément enfant du formulaire. Il semble que les messages ne sont pas routés par le principal WndProc (voir winapi natif ci-dessous), ou disons, les touches F1 et F2 ne pas bulle de l'enfant à parent comme on le voit dans une application fenêtre Win32 API. [Sous-classe approche]
- en utilisant OpenNetCF Application2/ApplicationEx et un IMessageFilter fonctionne. Si vous utilisez déjà ou voyez d'autres besoins pour OpenNetCF/SmartDeviceFramework, vous pouvez utiliser cette approche. [SmartDeviceFramework Application2/IMessageFilter approche] en utilisant un crochet de clavier global fonctionne. C'est celui que je préfère, car il est facile à utiliser et donne tous les messages du clavier. [Approche KeybdHook]
Questions connexes
- 1. Détection Connexion USB - C# .Net CF 3.5
- 2. appuyez plusieurs fois sur la touche C#
- 3. .NET 3.5 GridView - Sélectionnez plusieurs lignes avec la touche Ctrl appuyez sur
- 4. OpenNetCF SDF vs .Net CF 3.5
- 5. .NET CF 3.5 TextBox - désactiver le dictionnaire
- 6. HttpWebRequest et SSL dans .NET CF 3.5
- 7. .NET 3.5 CF sur Windows CE Platform Builder 6
- 8. C# Saut de boucle sur la touche Appuyez sur
- 9. Détection d'un tap sur le contrôle de barre d'état dans .net CF 3.5
- 10. Effacer la mise au point EditText lorsque vous appuyez sur le bouton Précédent lorsque la touche programmable est affichée
- 11. ModelPopupExtender et appuyez sur la touche Entrée
- 12. Problème de clavier - appuyez sur la touche
- 13. IME - Comment gérer la touche Appuyez sur
- 14. HTML5 - Android - appuyez sur la touche
- 15. Comment configurer Visual Studio pour travailler avec .net 3.5 CF?
- 16. CF .NET 3.5 Réduire Xml Nom de Longueurs
- 17. Control.Invoke délégués dans CF 3.5
- 18. Appuyez sur la touche Echap pour appeler la méthode
- 19. Comment capturer une touche de suppression appuyez sur C#?
- 20. Powershell Appuyez sur une touche pour quitter
- 21. C# .net 3.5 System.Net.Mail
- 22. ASP.Net ImageButton Volant Entrée touche Appuyez sur
- 23. Capture d'une touche 'supprimer' Appuyez sur
- 24. appuyez sur le bouton d'affichage lorsque vous appuyez sur la touche du clavier
- 25. Exécution de JavaScript sur la touche Appuyez sur
- 26. Asp.Net Search, trouvé des changements sur la touche Appuyez sur
- 27. ModalViewController ne s'affiche pas sur la touche Appuyez sur
- 28. Android simuler une touche Appuyez sur
- 29. C# .Net CF Form.Invoke augmenter ArgumentException
- 30. Comment ajouter des attributs à xml en utilisant XmlDocument dans C# .net CF 3.5
J'ai implémenté votre solution. Fonctionne parfaitement à l'intérieur de l'application, mais une fois que j'ai quitté l'application, il semble que la méthode UnRegisterRecordKey ne ramène pas les touches programmables à la normale (ce qui signifie qu'elles ne fonctionnent plus une fois au niveau du système d'exploitation) –