2013-08-14 5 views
-1

J'ai un nouveau problème avec un morceau de code de c + +. J'ai pression d'une touche pour faire une bascule clé ou quelque chose de similaire ... peut-être le code expliquera mieux que moi:Conversion de C++ (GetAsyncKeyState) en C# - WPF

while (1) { 
    Sleep (1); 
if (GetAsyncKeyState(VK_TAB) & 1) { 
    toggle = !toggle; 
if(toggle) 
    { 
     code here...(); 
    } 
else 
    { 
     code here...(); 
     } 
    } 
} 

En C++ tout va bien ... mais le portage vers C# - WPF, me donne se brise . Une idée quel est le moyen le plus facile? Merci,

éditer 2: Pourquoi ne fonctionne pas? J'ai enregistré la clé pour l'action .. mais ne démarre pas. C'est parce que je suis déjà dans la méthode?

KeyboardHook hook = new KeyboardHook(); // take action on keys pressed. hook.KeyPressed += new EventHandler<KeyPressedEventArgs>(fireUp); // register the event that is fired after the key press. hook.RegisterHotKey(ModKeys.None, Keys.Tab);

void fireUp(object sender, KeyPressedEventArgs e) 
{ 
    bool toggle = false; 
    toggle = !toggle; 
    byte[] byt = { 0xC7,0x83,0x1A,0x05,0x00,0x00,0x00,0x00,0x00,0x00 }; 
for (int i = 6; i < 10; ++i) 
    { 
     byt[i] = (byte)(atkSpd & 0xFF); 
     atkSpd = atkSpd >> 8; 
    } 
if (toggle) 
    { 
     Write(vMemory + 8, byt, 10); 
     Write(vMemory, BitConverter.GetBytes((vMemory + 8)), 8); 
     Write(atkBase, new byte[] { 0xFF, 0x24, 0x25 }, 3); 
     Write(atkBase + 3, BitConverter.GetBytes((vMemory)), 4); 
    } 
else 
    { 
     Write(atkBase, new byte[] { 0x66, 0x89, 0xB3, 0x1A, 0x05, 0x00, 0x00 }, 7); 
    } 

}

+0

Montrez-nous le code qui plante, c'est-à-dire, montrez-nous ce que vous avez essayé. –

+0

J'ai de nombreux codes de panne de toute façon ... C'est de WPF, mais ne fonctionne pas parce que je pense est juste pour les boutons MainWindow ..: 'private void pressTab (expéditeur d'objet, KeyEventArgs e) { if (e.Key == Key.Tab) { rwMem.StartGS(); } sinon if (e.Key == Key.Tab) { rwMem.StartSW(); } } ' – user2558921

Répondre

0

Enfin, je le répare.

public partial class MainWindow : Window 
{ 
private bool toggle = true; 
} 

private void fireUp(rwKey hotKey) 
    { 
     byte[] byt ={0xC7,0x83,0x1A,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x8B,0x74,0x24, 
     0x40,0x48,0x8B,0x6C,0x24,0x48,0x48,0x8B,0x5C,0x24,0x50,0x48,0x83,0xC4,0x58,0xC3}; 
     for (int i = 6; i < 10; ++i) { byt[i] = (byte)(atkSpd & 0xFF); atkSpd = atkSpd >> 8; } 

     bool kd = (toggle = !toggle); 

     if (kd) 
     { 
      Write(vMemory + 8, byt, 30); 
      Write(vMemory, BitConverter.GetBytes((vMemory + 8)), 8); 
      Write(atkBase, new byte[] { 0xFF, 0x24, 0x25 }, 3); 
      Write(atkBase + 3, BitConverter.GetBytes((vMemory)), 4); 
     } 
     else 
     { 
      Write(atkBase, new byte[] { 0x66, 0x89, 0xB3, 0x1A, 0x05, 0x00, 0x00 }, 7); 
     } 
    } 
1

Y at-il des raisons pour lesquelles vous ne pouvez pas utiliser un événement KeyDown/KeyPress/KeyUp? À mon avis, c'est une meilleure approche, pour ne pas dire que c'est plus efficace (ne pas vérifier tout le temps).

Si vous voulez utiliser l'approche que vous avez publiée, je dirais que le crash se produit parce que la boucle while est infinie, ne permettant rien d'autre. Il aurait été utile si vous avez fourni une exception que vous obtenez à l'accident ou au moins quelques informations sur ce qui se passe réellement.

+0

Ne fonctionne pas la touche TAB si je ne suis pas sur la fenêtre wpf .. et je dois le faire fonctionner en arrière-plan aussi. – user2558921

+0

Désolé pour un peu de réponse en retard ... Avec cela, je pense que vous cherchez des raccourcis globaux http://www.codeproject.com/Tips/88977/Setting-A-Global-Hot-Key Mais je pense l'enregistrement d'une clé de tabulation comme globale serait une mauvaise idée car elle est utilisée dans de nombreuses autres fenêtres, ce qui peut créer des problèmes. –

+0

Le code fonctionne très bien mais ... il écrase la clé de jeu mappée et c'est très mauvais. Je suis toujours à la recherche d'une autre solution :( – user2558921