3

Je voudrais simuler des raccourcis pour une fonction de contrôle à distance de notre application Windows Mobile. Tout raccourci possible doit être pris en charge (penser Ctrl +/ouAlt + Ä).Combiner keybd_event et PostKeybdMessage pour simuler un raccourci

Avec keybd_event Je peux très bien simuler des raccourcis, mais seuls les Virtual-Key Codes sont autorisés avec cette fonction. Par conséquent, j'ai pensé à la fonction PostKeybdMessage qui me permet d'envoyer n'importe quel caractère à la fenêtre de premier plan. Mais si je combine les deux appels, Windows imprimera simplement le caractère au lieu d'exécuter le raccourci.

Voici ce que j'ai essayé:

  • Envoi en silence la touche CTRL (KEYEVENTF_SILENT)
  • Ajout du KeyShiftAnyCtrlFlag au PostKeybdMessage appel
  • joué beaucoup avec les tampons et les drapeaux du PostKeybdMessage appel (ce qui est assez confus)

Mes questions sont les suivantes:

  • Peut PostKeybdMessage être utilisé pour simuler des raccourcis ou suis-je juste perdre mon temps? Si c'est possible, qu'est-ce que j'ai fait de mal dans l'exemple de code?
  • Y at-il peut-être un truc pour envoyer des caractères spéciaux (trémas, #, =, ...) avec keybd_event?
  • Existe-t-il un autre moyen de simuler un raccourci?

application de test simple

public partial class ShortcutTest : Form 
{ 
    private const int KEYEVENTF_KEYUP = 0x0002; 
    private const int HWND_FOREGROUND = -1; 

    private const uint KEY_STATE_DOWN = 0x0080; 
    private const uint KEY_SHIFT_NO_CHARACTER = 0x00010000; 
    private const uint KEY_SHIFT_ANY_CONTROL = 0x40000000; 

    private const byte VK_CONTROL = 0x11; // Keys.ControlKey 

    [DllImport("coredll.dll", SetLastError = true)] 
    internal static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); 

    [DllImport("coredll.dll")] 
    private static extern bool PostKeybdMessage(int hwnd, uint vKey, uint KeyStateFlags, uint cCharacters, uint[] pShiftStateBuffer, uint[] pCharacterBuffer); 

    public ShortcutTest() 
    { 
    InitializeComponent(); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
    timer1.Enabled = false; 

    keybd_event((byte)Keys.ControlKey, 0, 0, 0); 

    // this would work: keybd_event((byte)Keys.X, 0, 0, 0); 

    // this won't work 
    SendChar('x'); 

    //keybd_event((byte)Keys.X, 0, KEYEVENTF_KEYUP, 0); 

    keybd_event((byte)Keys.ControlKey, 0, KEYEVENTF_KEYUP, 0); 

    button1.Enabled = true; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
    timer1.Enabled = true; 
    button1.Enabled = false; 
    } 

    public void SendChar(char ch) 
    { 
    uint[] input = new uint[] { (uint)ch }; 

    uint[] downStates = { KEY_STATE_DOWN | KEY_SHIFT_ANY_CONTROL }; 
    uint[] upStates = { KEY_SHIFT_NO_CHARACTER | KEY_SHIFT_ANY_CONTROL }; 

    PostKeybdMessage(HWND_FOREGROUND, 0, downStates[0], 1, downStates, input); 

    // tested with KeyShiftDeadFlag and some others, with \0 char ... 
    PostKeybdMessage(HWND_FOREGROUND, 0, upStates[0], 1, upStates, input); 
    } 

} 

Edit: Je viens de regarder la mise en œuvre de OpenNETCF de SendKeys et ils utilisent keybd_event seulement (si "+ un" échouera par exemple).

Répondre

0

Avez-vous essayé d'utiliser SendInput? Je suis en fait en C++ et le code suivant:

INPUT input[4]; 
memset(input, 0, sizeof(INPUT)*4); 
input[0].type = INPUT_KEYBOARD; 
input[0].ki.wVk = VK_MENU; 

input[1].type = INPUT_KEYBOARD; 
input[1].ki.wVk = L'a'; 

input[2].type = INPUT_KEYBOARD; 
input[2].ki.wVk = VK_MENU; 
input[2].ki.dwFlags = KEYEVENTF_KEYUP; 

input[3].type = INPUT_KEYBOARD; 
input[3].ki.wVk = L'a'; 
input[3].ki.dwFlags = KEYEVENTF_KEYUP; 

SendInput(4, input, sizeof(INPUT)); 

génère des messages qui ressemblent devrait fonctionner, je suis arrivé à espionner WM6.5.

+0

'wVk' est également un code de clé virtuelle :( – Gene

+0

Vous pourriez vouloir vérifier MapVirtualKey: http://msdn.microsoft.com/en-us/library/ms911789.aspx De docs il semble qu'il devrait faire conversions de VK-> SC et SC-> VK – marcinj

+0

Je pense que cela vaut la peine d'essayer. – Gene

Questions connexes