设置 WM_KEYDOWN lParam 参数

Joh*_*eti 2 c# winapi

public class sendKeys {
    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll")]
    public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr, lParam);

    public static void sendKeystroke(ushort k)
        {
            const uint WM_KEYDOWN = 0x0100;
            const uint WM_SYSCOMMAND = 0x018;
            const uint SC_CLOSE = 0x053;

            IntPtr WindowToFind = FindWindow(null, "processname");

            IntPtr result3 = SendMessage(WindowToFind, WM_KEYDOWN, ((IntPtr)k), (IntPtr)0);
        }
}
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646280%28v=vs.85%29.aspx 我可以在上面的页面中看到,lParam 参数应该包含我想要的所有参数发送,以比特为单位。例如,如果我想为 ScanCode 发送一个“0x2D”值,我应该怎么做?

Typ*_*eIA 5

MSDN 页面告诉您lParam每个参数要使用哪些位。您需要做的就是进行一些位移来组装lParam

uint repeatCount = 0;
uint scanCode = 0x2D;
uint extended = 0;
uint context = 0;
uint previousState = 0;
uint transition = 0;

// combine the parameters above according to the bit
// fields described in the MSDN page for WM_KEYDOWN

uint lParam = repeatCount
    | (scanCode << 16)
    | (extended << 24)
    | (context << 29)
    | (previousState << 30)
    | (transition << 31);
Run Code Online (Sandbox Code Playgroud)