7

SendMessageを使用してキーストロークを送信しようとしていますが、lParam がよくわかりません。異なるビットが各パラメーターを表し、それらを順番に並べる必要があることを理解しています。

私はこの質問これを読んだので、ビットをどの順序にする必要があるかはわかっていますが、それを行う方法がわかりません...

次の lParam を作成するにはどうすればよいですか?

repeat cound = 0,
scan code = {Don't know what this is?},
extended key = 1,
reserved = 0,
context code = 0,
previous key state = 1,
transition state = 0
4

2 に答える 2

12

AutoITには必要な機能があることに気付いたので、ソースファイルsendKeys.cppを調べて、この関数の次のC ++コードスニペットを見つけました。C#に変換するのは簡単です。

scan = MapVirtualKey(vk, 0);

// Build the generic lparam to be used for WM_KEYDOWN/WM_KEYUP/WM_CHAR
lparam = 0x00000001 | (LPARAM)(scan << 16);         // Scan code, repeat=1
if (bForceExtended == true || IsVKExtended(vk) == true)
    lparam = lparam | 0x01000000;       // Extended code if required

if ( (m_nKeyMod & ALTMOD) && !(m_nKeyMod & CTRLMOD) )   // Alt without Ctrl
    PostMessage(m_hWnd, WM_SYSKEYDOWN, vk, lparam | 0x20000000);    // Key down, AltDown=1
else
    PostMessage(m_hWnd, WM_KEYDOWN, vk, lparam);    // Key down

スキャンコードはMapVirtualKeyで生成できます

C#翻訳:

public static void sendKey(IntPtr hwnd, VKeys keyCode, bool extended)
{
    uint scanCode = MapVirtualKey((uint)keyCode, 0);
    uint lParam;

    //KEY DOWN
    lParam = (0x00000001 | (scanCode << 16));
    if (extended)
    {
        lParam |= 0x01000000;
    }
    PostMessage(hwnd, (UInt32)WMessages.WM_KEYDOWN, (IntPtr)keyCode, (IntPtr)lParam);

    //KEY UP
    lParam |= 0xC0000000;  // set previous key and transition states (bits 30 and 31)
    PostMessage(hwnd, WMessages.WM_KEYUP, (uint)keyCode, lParam);
}

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern uint MapVirtualKey(uint uCode, uint uMapType);
于 2012-04-23T13:03:02.853 に答える
1

絶対に SendMessage を使用する必要がある場合は、int のビットを正しい位置に切り替える必要があります。

このサイトでは、C# でこれを行う方法について説明しています。

http://codeidol.com/csharp/csharpckbk2/Classes-and-Structures/Turning-Bits-On-or-Off/

あなたの質問を参照すると、 ScanCode は、送信しようとしているキーの値であり、特定の状態も表しています。たとえば、A を押すためのスキャン コードは、A を離すためのコードとは異なります。

ウィキペディアには、それらに関する記事があります。

http://en.wikipedia.org/wiki/Scancode

于 2012-04-23T11:58:08.683 に答える