1

我正在尝试通过使用 user32.dll keybd_event 模拟按键来突出显示文本框中的文本(使用SHIFT+ Win 快捷方式),但它不起作用:RIGHT_ARROW

[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
public const int SHIFT_LEFT = 0xA0;
public const int RIGHT = 0x27;

....

keybd_event(SHIFT_LEFT, 0, 0, 0);
keybd_event(RIGHT, 0, 0, 0);
keybd_event(RIGHT, 0, 2, 0);
keybd_event(SHIFT_LEFT, 0, 2, 0);

光标向右移动,但文本未突出显示...谁能解释为什么?

编辑: 为什么这适用于 Windows OnScreenKeyboard?


KEYEVENTF_EXTENDEDKEY (0x0001):如果指定,扫描码前面有一个值为 0xE0 (224) 的前缀字节。
所以,我这样做了:

keybd_event(SHIFT_LEFT, 0, 1 | 0, 0);
keybd_event(RIGHT, 0, 1 | 0, 0);
keybd_event(RIGHT, 0, 1 | 2, 0);
keybd_event(SHIFT_LEFT, 0, 1 | 2, 0);

问题解决了!
关于 KEYEVENTF_EXTENDEDKEY 的详细解释可以在这里找到。

4

1 回答 1

1

有些功能已经在 MSDN 上公开可用,我不需要解释。以下是在不同系统上工作的基本信息代码:

    ''' <summary>
    ''' Simulate key down event on Windows machine
    ''' </summary>
    ''' <param name="nCode">key</param>
    ''' <remarks></remarks>
    Public Sub SetKeyDown(ByVal nCode As Integer)
        Dim vKey As Byte = Convert.ToByte(nCode)
        Dim scanCode As Integer = MapVirtualKey(vKey, 0)
        Dim ret As Integer = keybd_event(vKey, CByte(scanCode), KEYEVENTF_EXTENDEDKEY Or 0, IntPtr.Zero)
    End Sub

    ''' <summary>
    ''' Simulate key up event on Windows machine
    ''' </summary>
    ''' <param name="nCode">key</param>
    ''' <remarks></remarks>
    Public Sub SetKeyUp(ByVal nCode As Integer)
        Dim vKey As Byte = Convert.ToByte(nCode)
        Dim scanCode As Integer = MapVirtualKey(vKey, 0)
        Dim ret As Integer = keybd_event(vKey, CByte(scanCode), KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, IntPtr.Zero)
    End Sub

MSDN 参考资料

键位事件:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646304%28v=vs.85%29.aspx

MapVirtualKey:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646306%28v=vs.85%29.aspx

于 2014-09-24T15:36:44.490 回答