2017-01-10 81 views
0

我有在C#中相当一个问题,现在我试图代码时按F8键被按下检测功能,并设置布尔F8Pushed为true,那么当它再次按下设定F8Pushed为false。如何当一个键被按下一个布尔变量设置为true和false时,它再次推?

这里是我的代码至今:

static bool IsKeyPressed() //This Function Returns True if F8 Is Pushed and False if F8 is up 
{ 
    bool is_pressed = (GetAsyncKeyState(119) & 0x8000) != 0; 
    return is_pressed; 
} 

static void CheckHotKey() //This is the Function that I am calling the other function from for debugging. 
{ 
    while (true) 
    { 
     Console.WriteLine(IsKeyPressed()); 
    } 
} 

现在,我有和无法解决的问题是,我不能找到一个办法让变量自身复制到另一个变量,并如果有意义的话,能够回到错误。我可以得到一个布尔值设置为true,如果IsKeyPressed() == true但我无法弄清楚如何得到它回false时,它再次返回true。

在此先感谢!

编辑: 感谢您的帮助家伙但是我仍然有一些麻烦,下面有一个更新。

static bool IsKeyPressed() 
    { 
     is_pressed = (GetAsyncKeyState(119) & 0x8000) != 0 && !is_pressed; 
     return is_pressed; 
    } 

    static void CheckHotKeys() 
    { 
     while (true) 
     { 
      IsKeyPressed(); 
      if(is_pressed) 
      { 
       F8Pushed = true; 
      } 
      Console.WriteLine(F8Pushed); 
      if(IsKeyPressed()) 
      { 
       F8Pushed = false; 
      } 
      Console.WriteLine(F8Pushed); 
     } 
    } 

我设法得到它的工作有点不过,它是非常错误和很多次关键中风没有检测到任何想法?

+0

看起来你已经写了一个无限循环与你而(真)。该变量永远不会改变,因为线程永远不会离开这个循环。 – Mishax

+0

但我可以调用其他功能,可以改变它的权利? – user3885393

回答

1

我不确定我是否完全理解了什么你正在努力完成。您的代码包含了许多问题的部分,我选择写一个完全新的代码:指定键的

class Program 
{ 
    const byte VK_F8 = 0x77; 
    const byte VK_ESC = 0x1b; 

    static bool globalAppState = false; 

    static void Main(string[] args) 
    { 
    bool lastState = IsKeyPressed(VK_F8); 
    while (!IsKeyPressed(VK_ESC)) 
    { 
     bool newState = IsKeyPressed(VK_F8); 
     if (lastState != newState) 
     { 
     if (newState) 
     { 
      Console.WriteLine("F8: pressed"); 
      globalAppState = !globalAppState; 
     } 
     else 
      Console.WriteLine("F8: released"); 
     lastState = newState; 
     } 
    } 
    } 

    static bool IsKeyPressed(byte keyCode) 
    { 
    return ((GetAsyncKeyState(keyCode) & 0x8000) != 0); 
    } 

    [DllImport("user32.dll")] 
    static extern short GetAsyncKeyState(int vKey); 
} 

功能IsKeyPressed(VK_F8)告诉你总是当前状态(按下/释放)。

当您只需要在更改(从按下到发布,或从发布到按下)时执行一些操作用您的特定任务替换控制台输出功能。

当你需要一些多线程就像在一个新的线程处理事件,这是一个不同的问题......(此范围内)

编辑:变量对每个新添加的关键变化按下的事件。这是肮脏的解决方案...

0

你不得不做出这样的变量is_pressed全球,以保持目前的状态。然后作出这样的尝试:

static bool is_pressed; 
static bool IsKeyPressed() 
{ 
    is_pressed = (GetAsyncKeyState(119) & 0x8000) != 0 && !is_pressed; 
    return is_pressed; 
} 

&& !is_pressed每次都会

0

切换的价值为你假设你存储在一个布尔值的按键结果:

bool isKeyPressed = true; 

你可以这样做:

isKeyPressed == IsKeyPressed() && !isKeyPressed; 
相关问题