C # и SendMessage (ключи) не работает - PullRequest
4 голосов
/ 20 июня 2010

Я пытался отправить ключ в приложение. Для простого теста я просто использовал блокнот. Вот как выглядит код:

[DllImport("USER32.DLL", EntryPoint = "SendMessageW", SetLastError = true,
         CharSet = CharSet.Unicode, ExactSpelling = true,
         CallingConvention = CallingConvention.StdCall)]
    public static extern bool SendMessage(IntPtr hwnd, int Msg, int wParam, int lParam);


        const int WM_KEYDOWN = 0x100;
    const int WM_a = 0x41;

        public void Press()
    {
        Process[] p = Process.GetProcessesByName("notepad");
        IntPtr pHandle = p[0].MainWindowHandle;

        SendMessage(pHandle, WM_KEYDOWN, WM_a, 0);
    }

Но ничего не происходит.

Моя главная цель - отправить ключ в приложение с повышенными правами, но я был бы рад сначала отправить его в блокнот. Я хочу работать с SendMessage, потому что я хочу контролировать, как долго я нажимаю кнопку, а также я не хочу, чтобы другое приложение было на переднем плане. Вот почему я не работаю с SendKeys.

1 Ответ

9 голосов
/ 20 июня 2010

Несколько проблем:

  • Ваше объявление неверно, последние 2 параметра - IntPtr, а не int
  • Вы должны использовать PostMessage, а не SendMessage
  • Вы отправляете не в то окно. Окно редактирования Блокнота является дочерним окном
  • Вы забыли отправить WM_KEYUP
  • Фактическая буква, которую вы получите, будет зависеть от состояния клавиши Shift

Снимок шеи: Vista и Win7 UIPI (изоляция привилегий пользовательского интерфейса) предотвращают внедрение запрещенного процесса в сообщения с повышенными правами.

...