3

WindowsMo​​bileアプリケーションのリモートコントロール機能のショートカットをシミュレートしたいと思います。可能なショートカットをサポートする必要があります(Ctrl+/またはAlt+を考えてくださいä)。

を使用keybd_eventすると、ショートカットを非常にうまくシミュレートできますが、この関数で許可されるのは仮想キーコードのみです。そこで、PostKeybdMessage前景の窓に任意の文字を送ることができる機能を考えました。しかし、2つの呼び出しを組み合わせると、Windowsはショートカットを実行する代わりに、文字を出力するだけです。

これが私が試したことです:

  • Ctrlキーをサイレントに送信する(KEYEVENTF_SILENT
  • 通話に追加KeyShiftAnyCtrlFlagするPostKeybdMessage
  • 呼び出しのバッファーとフラグで多くのことをしましたPostKeybdMessage(これはかなり混乱します)

私の質問は次のとおりです。

  • PostKeybdMessageショートカットをシミュレートするために使用できますか、それとも時間を無駄にしているだけですか?可能であれば、コードサンプルで何を間違えましたか?
  • 特殊文字(ウムラウト、#、=、...)を一緒に送信するトリックはありkeybd_eventますか?
  • ショートカットをシミュレートする別の方法はありますか?

簡単なテストアプリケーション

public partial class ShortcutTest : Form
{
  private const int KEYEVENTF_KEYUP = 0x0002;
  private const int HWND_FOREGROUND = -1;

  private const uint KEY_STATE_DOWN = 0x0080;
  private const uint KEY_SHIFT_NO_CHARACTER = 0x00010000;
  private const uint KEY_SHIFT_ANY_CONTROL = 0x40000000;

  private const byte VK_CONTROL = 0x11; // Keys.ControlKey

  [DllImport("coredll.dll", SetLastError = true)]
  internal static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

  [DllImport("coredll.dll")]
  private static extern bool PostKeybdMessage(int hwnd, uint vKey, uint KeyStateFlags, uint cCharacters, uint[] pShiftStateBuffer, uint[] pCharacterBuffer);

  public ShortcutTest()
  {
    InitializeComponent();
  }

  private void timer1_Tick(object sender, EventArgs e)
  {
    timer1.Enabled = false;

    keybd_event((byte)Keys.ControlKey, 0, 0, 0);

    // this would work: keybd_event((byte)Keys.X, 0, 0, 0);

    // this won't work
    SendChar('x');

    //keybd_event((byte)Keys.X, 0, KEYEVENTF_KEYUP, 0);

    keybd_event((byte)Keys.ControlKey, 0, KEYEVENTF_KEYUP, 0);

    button1.Enabled = true;
  }

  private void button1_Click(object sender, EventArgs e)
  {
    timer1.Enabled = true;
    button1.Enabled = false;
  }

  public void SendChar(char ch)
  {
    uint[] input = new uint[] { (uint)ch };

    uint[] downStates = { KEY_STATE_DOWN | KEY_SHIFT_ANY_CONTROL };
    uint[] upStates = { KEY_SHIFT_NO_CHARACTER | KEY_SHIFT_ANY_CONTROL };

    PostKeybdMessage(HWND_FOREGROUND, 0, downStates[0], 1, downStates, input);

    // tested with KeyShiftDeadFlag and some others, with \0 char ...
    PostKeybdMessage(HWND_FOREGROUND, 0, upStates[0], 1, upStates, input);
  }

}

編集:私はOpenNETCFの実装を調べたところ、SendKeysそれらは使用するkeybd_eventだけです(たとえば、「+ a」は失敗します)。

4

1 に答える 1

0

SendInputを使用してみましたか?私は実際にc++を使用しており、次のコードを使用しています。

INPUT input[4];
memset(input, 0, sizeof(INPUT)*4);
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = VK_MENU;

input[1].type = INPUT_KEYBOARD;
input[1].ki.wVk = L'a';

input[2].type = INPUT_KEYBOARD;
input[2].ki.wVk = VK_MENU;
input[2].ki.dwFlags = KEYEVENTF_KEYUP;

input[3].type = INPUT_KEYBOARD;
input[3].ki.wVk = L'a';
input[3].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(4, input, sizeof(INPUT));

動作するように見えるメッセージを生成します。WM6.5でスパイをチェックインしました。

于 2012-07-07T13:31:59.413 に答える