2010-06-20 2 views
3

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

[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.

ответ

8

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

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

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

Смежные вопросы