ฉันจะสร้างเหตุการณ์ที่จำลองการกดแป้นบนแป้นพิมพ์โดยใช้โปรแกรมได้อย่างไร
ฉันจะสร้างเหตุการณ์ที่จำลองการกดแป้นบนแป้นพิมพ์โดยใช้โปรแกรมได้อย่างไร
คำตอบ:
คำถามถูกแท็ก WPF แต่คำตอบจนถึงตอนนี้คือ WinForms และ Win32 ที่เฉพาะเจาะจง
หากต้องการทำสิ่งนี้ใน WPF เพียงแค่สร้าง KeyEventArgs และเรียก RaiseEvent บนเป้าหมาย ตัวอย่างเช่นในการส่งเหตุการณ์ KeyDown ของคีย์แทรกไปยังองค์ประกอบที่โฟกัสในปัจจุบัน:
var key = Key.Insert; // Key to send
var target = Keyboard.FocusedElement; // Target element
var routedEvent = Keyboard.KeyDownEvent; // Event to send
target.RaiseEvent(
new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(target),
0,
key)
{ RoutedEvent=routedEvent }
);
โซลูชันนี้ไม่ได้อาศัยการโทรแบบเนทีฟหรือภายในของ Windows และควรมีความน่าเชื่อถือมากกว่าวิธีอื่น ๆ นอกจากนี้ยังช่วยให้คุณจำลองการกดแป้นบนองค์ประกอบเฉพาะได้
โปรดทราบว่ารหัสนี้ใช้ได้กับเหตุการณ์ PreviewKeyDown, KeyDown, PreviewKeyUp และ KeyUp เท่านั้น หากคุณต้องการส่งเหตุการณ์ TextInput คุณจะดำเนินการนี้แทน:
var text = "Hello";
var target = Keyboard.FocusedElement;
var routedEvent = TextCompositionManager.TextInputEvent;
target.RaiseEvent(
new TextCompositionEventArgs(
InputManager.Current.PrimaryKeyboardDevice,
new TextComposition(InputManager.Current, target, text))
{ RoutedEvent = routedEvent }
);
โปรดทราบว่า:
การควบคุมคาดว่าจะได้รับเหตุการณ์การแสดงตัวอย่างเช่น PreviewKeyDown ควรนำหน้า KeyDown
การใช้ target.RaiseEvent (... ) ส่งเหตุการณ์ไปยังเป้าหมายโดยตรงโดยไม่ต้องมีการประมวลผลเมตาเช่นตัวเร่งการจัดองค์ประกอบข้อความและ IME นี่คือสิ่งที่คุณต้องการตามปกติ ในทางกลับกันหากคุณทำสิ่งที่จำลองแป้นคีย์บอร์ดจริงด้วยเหตุผลบางประการคุณจะใช้ InputManager.ProcessInput () แทน
Keyboard.PrimaryDevice.ActiveSource
ดูstackoverflow.com/questions/10820990/…
Ctrl+C
)
ในการสร้างเหตุการณ์สำคัญโดยไม่มี Windows Forms Context เราสามารถใช้วิธีการต่อไปนี้
[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 KEYEVENTF_EXTENDEDKEY = 0x0001;
int press()
{
//Press the key
keybd_event((byte)VK_UP, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
return 0;
}
รายการของคีย์เสมือนมีการกำหนดไว้ที่นี่
เพื่อให้ได้ภาพที่สมบูรณ์โปรดใช้ลิงค์ด้านล่าง http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html
ฉันไม่ได้ใช้ แต่SendKeysอาจทำในสิ่งที่คุณต้องการ
ใช้ SendKeys เพื่อส่งการกดแป้นพิมพ์และการกดแป้นพิมพ์ร่วมกันไปยังแอปพลิเคชันที่ใช้งานอยู่ คลาสนี้ไม่สามารถสร้างอินสแตนซ์ได้ หากต้องการส่งการกดแป้นพิมพ์ไปยังชั้นเรียนและดำเนินการตามขั้นตอนของโปรแกรมของคุณต่อทันทีให้ใช้ Send หากต้องการรอกระบวนการใด ๆ ที่เริ่มต้นโดยการกดแป้นพิมพ์ให้ใช้ SendWait
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
ได้อย่างง่ายดาย! (เพราะมีคนอื่นทำงานให้เราแล้ว ... )
หลังจากใช้เวลามากในการพยายามทำสิ่งนี้กับคำตอบที่แนะนำฉันเจอโครงการ codeplex Windows Input Simulatorซึ่งทำให้ง่ายเหมือนจำลองการกดปุ่ม:
ติดตั้งแพคเกจสามารถทำได้หรือจากตัวจัดการแพ็คเกจ NuGet หรือจากคอนโซลตัวจัดการแพ็คเกจเช่น:
ติดตั้งแพ็คเกจ InputSimulator
ใช้รหัส 2 บรรทัดนี้:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
แค่นี้แหละ!
------- แก้ไข --------
หน้าโครงการบน codeplex ถูกตั้งค่าสถานะด้วยเหตุผลบางประการนี่คือลิงก์ไปยังแกลเลอรี NuGet
ของ Windows SendMessage APIกับส่งWM_KEYDOWN