2014-03-25 2 views
0

이 콘솔 프로그램에서 달성하고자하는 것은 user32.dll을 사용하여 키를 누르고있을 수 있습니다. 나는 확장 된 키를 보내지 않는다는 것을 안다. 하지만 나는 scancode가 맞을 때 그것을 보내는 것을 생각하지 않는다. 그리고 나는 열쇠를 붙잡기 위해 그것을 올바른 깃발로 보내고 있다고 생각합니다. 나는 또한 열쇠를해야한다는 것을 압니다. 하지만 지금 당장 필요한 건 열쇠를 내려 놓는 것뿐입니다. 어떤 도움이 많이 아래의 코드는 keybd_event키를 누르고있는 방법 C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

namespace pressand_hold 
{ 
class Program 
{ 
    [DllImport("user32.dll")] 
    public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo); 

    const int VK_UP = 0x26; //up key 
    const int VK_DOWN = 0x28; //down key 
    const int VK_LEFT = 0x25; 
    const int VK_RIGHT = 0x27; 
    const uint KEYEVENTF_KEYUP = 0x0002; 
    const uint SCANCODE = 0x0008; 
    const int KEY_0 = 11; 

    internal enum ScanCodeShort : short 
    { 

     KEY_9 = 10, 
     KEY_A = 30, 
     KEY_B = 48, 
     KEY_C = 46, 
     KEY_D = 32, 
     KEY_E = 18, 
     KEY_F = 33, 
     KEY_G = 34, 
     KEY_H = 35, 
     KEY_I = 23, 
     KEY_J = 36, 
     KEY_K = 37, 
     KEY_L = 38, 
     KEY_M = 50, 
     KEY_N = 49, 
     KEY_O = 24, 
     KEY_P = 25, 
     KEY_Q = 16, 
     KEY_R = 19, 
     KEY_S = 31, 
     KEY_T = 20, 
     KEY_U = 22, 
     KEY_V = 47, 
     KEY_W = 17, 
     KEY_X = 45, 
     KEY_Y = 21, 
     KEY_Z = 44, 
    } 

    static void Main(string[] args) 
    { 
     Thread.Sleep(2000); 
     // push V key 
     keybd_event((byte)ScanCodeShort.KEY_V, 0x45, 0, 0); 
     // release V key 
     keybd_event((byte)ScanCodeShort.KEY_V, 0x45, KEYEVENTF_KEYUP, 0); 
     Console.WriteLine("done");   
    Console.Read(); 
    } 
} 
} 
+0

어떻게 작동하지 않습니까? –

+0

@MartinLiversage는 아무 것도 입력하지 않습니다. 내가 이걸 실행 한 후 메모장을 클릭하고 2 초 후에 아무 일도 일어나지 않는다. – hurnhu

+0

왜 자동화를 사용하지 않는가? –

답변

2

2 층과 3 인수를 작동하지 않는 지금의로, 감사 잘못 될 것이다.

2 차 인수가 0x45

3 인수가 키를 누르면 0이어야합니다 8. ​​될 수 없습니다해야 pinvoke definitionmsdn

을 살펴 보자.

static void Main(string[] args) 
{ 
    Thread.Sleep(2000); 
    // push V key 
    keybd_event((byte)ScanCodeShort.KEY_V, 0x45, 0, 0); 

    Console.WriteLine("done"); 
    Console.Read(); 
} 

스캔 코드가 다른 아무것도 없다는 것을 문자열 (숫자 또는 영숫자)의 시각적 표현 :

뭔가처럼 될 수 있습니다.

코드에주의하십시오. 47 헥사 도중에 0x2F 인, 그것이 Virtual Key Codes

KEY_V = 86, 

* 완전한 코드 VK_HELP이다 *

using System; 
using System.Runtime.InteropServices; 
using System.Threading; 

namespace pressand_hold 
{ 
    internal class Program 
    { 
     internal enum ScanCodeShort : short 
     { 
      KEY_0 = 48, 
      KEY_1, 
      KEY_2, 
      KEY_3, 
      KEY_4, 
      KEY_5, 
      KEY_6, 
      KEY_7, 
      KEY_8, 
      KEY_9, 
      KEY_A = 65, 
      KEY_B, 
      KEY_C, 
      KEY_D, 
      KEY_E, 
      KEY_F, 
      KEY_G, 
      KEY_H, 
      KEY_I, 
      KEY_J, 
      KEY_K, 
      KEY_L, 
      KEY_M, 
      KEY_N, 
      KEY_O, 
      KEY_P, 
      KEY_Q, 
      KEY_R, 
      KEY_S, 
      KEY_T, 
      KEY_U, 
      KEY_V, 
      KEY_W, 
      KEY_X, 
      KEY_Y, 
      KEY_Z, 
     } 

     [DllImport("user32.dll")] 
     public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo); 

     private static void Main(string[] args) 
     { 
      Thread.Sleep(2000); 

      keybd_event((byte)ScanCodeShort.KEY_V, 0x45, 0, 0); 

      Console.WriteLine("done"); 
      Console.Read(); 
     } 
    } 
} 

사용 루프 키를 길게 (while(), for() 등)

+0

두 번째 arg를 0x45로 변경하고 세 번째 키를 KEYEVENTF_KEYUP으로 변경했습니다. 변화가 필요한 다른 것이 있습니까? 나는 msdn을 살펴 봤는데 지금 당장 보인다. – hurnhu

+0

@MichaelLapan KEYEVENTF_KEYUP은 키를 놓는 것이다. 그게 틀림 없습니까? – Xaruth

+0

@ Xaurth 아니 메신저 키를 누르고 있으려고하지만 .. 거기에 무엇을 넣어야할지 잘 모르겠다 .. – hurnhu