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
auPostKeybdMessage
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).
'wVk' est également un code de clé virtuelle :( – Gene
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
Je pense que cela vaut la peine d'essayer. – Gene