[英]C# .net send keys NOT using SendKey() but rather with hooking mabye
在我的具體情況下,我正在嘗試創建一個將鍵盤按鍵發送到DosBox的應用程序(dos-games模擬器,而不是Windows命令提示符)。
我嘗試使用SendKeys這樣做,但這不起作用,因為DosBox不是一個處理Windows消息的應用程序(一個例外告訴我)。
目前我正在嘗試使用鍵盤鈎子,如下所示:第一種方法是接收鈎子擊鍵並將它們傳遞給下一個應用程序(如本示例中所示 )
private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
return CallNextHookEx(hookId, nCode, wParam, lParam);
}
private void GenerateKeyPress()
{
int vkCode = (int)Keys.Up; //My chosen key to be send to dosbox
IntPtr lParam = new IntPtr(vkCode);
IntPtr wParam = new IntPtr(255);
CallNextHookEx(hookId, 0, wParam, lParam);
}
但是,CallNextHookEx()函數調用會引發訪問沖突異常。
我在這里需要考慮什么?
訪問沖突的原因是LPARAM
用於低級鍵盤鈎子 ,即用它創建的一個
SetWindowsHookEx(WH_KEYBOARD_LL,...)
是指向KBDLLHOOKSTRUCT
的指針,而不是偽裝成指針的鍵碼。 你告訴掛鈎鏈中的下一個掛鈎來訪問任意內存位置。 (另外, WPARAM
應該是WM_KEYDOWN
, WM_KEYUP
, WM_SYSKEYDOWN
或WM_SYSKEYUP
。)
您鏈接的示例代碼使用Marshal.ReadInt32(lParam)
來獲取密鑰代碼,該代碼實際上是讀取指針引用的結構中的第一個整數。
至於你想實現什么,要做到這一點是使用SendInput
這是這是一個話題被 覆蓋 在這里 這么 多 時間 即 它 並 不能 承受 重復。
(這甚至不是所有的SendInput問題)
我認為您應該使用“keybd_event”來替換“SendKeys”。
public static class Keyboard
{
public static void Press(Keys keys, int sleep = 1)
{
var keyValue = (byte)keys;
NativeMethods.keybd_event(keyValue, 0, 0, UIntPtr.Zero); //key down
Thread.Sleep(sleep);
NativeMethods.keybd_event(keyValue, 0, 0x02, UIntPtr.Zero); //key up
}
}
internal static partial class NativeMethods
{
[DllImport("user32.dll")]
internal static extern void keybd_event(byte bVk, byte bScan, int dwFlags, UIntPtr dwExtraInfo);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.