2016-03-06 5 views
0

Я провел 3 дня с этой темой. Все результаты, которые я нашел, используют «SetForeground», а затем SendMessage или некоторые API (keybd_event, kennedy (opensource) и т. Д.). Конечно, SendKeys не передает ключ (ы) указанному процессу, я хочу отправить ключ (ы) в указанный процесс, который я знаю PID или HWND.Есть ли способ отправить ключ (ы) в другое приложение без фокуса?

У меня нет никаких идей, возможно ли это? Если нет, я бы предпочел реализовать с SetForeground, что я непреднамеренно.

Любые идеи?

+0

[This] (http://stackoverflow.com/questions/1220820/how-do-i-send-key-strokes-to-a-window-without-how-to-activate-it-using-window) это хорошо для тебя. Если вы можете работать с функцией WinAPI 'SetForeground', преобразовать SendMessage в C# – Sakura

+0

не так сложно. @Sakura Определенно связанный вопрос и вопрос. Но принятый ответ сказал, что ему нужно сосредоточиться. Я попробую второй ответ, который не будет принят. Спасибо. – Gioskhan

+0

Это ключ: 'вам нужно сначала найти его HWND-дескриптор, а затем отправить соответствующие сообщения WM_KEYUP/DOWN и WM_CHAR прямо на него'. Он работает, предположим, вы знаете, как «форматировать сообщения WM_KEYUP/DOWN и WM_CHAR». Найдите p/invoke документ об этом. – Sakura

ответ

0

Я только что нашел решение.

Я не знал о концепции табуляции. Ключевым моментом был дескриптор табуляции, настоящий дескриптор обработки ключей. Если я использую основной дескриптор окна, он может обрабатывать WM_CLOSEWM_SETTEXT (также SetWindowText (строка)), но не WM_KEYDOWN. Я представил последовательность.

  1. тактный клавиатуры
  2. ключевое событие к ручке (основная ручка окна)
  3. ручка придает получил событие WM_KEYDOWN/WM_CHAR/WM_KEYUP с VK_ *

Так что я должен найти вкладку ручки первый.

int getTabHandle() { 
    int hwnd = 0; 
    hwnd = FindWindowEx(hwnd , 0, "iexplore.exe", null); 
    hwnd = FindWindowEx(hwnd , 0, "IEFrame", null); 
    hwnd = FindWindowEx(hwnd , 0, "Frame Tab", null); 
    hwnd = FindWindowEx(hwnd , 0, "TabWindowClass", null); 
    hwnd = FindWindowEx(hwnd , 0, "Shell DocObject View", null); 
    hwnd = FindWindowEx(hwnd , 0, "Internet Explorer_Server", null); 
    return hwnd; 
} 

С помощью этого hwnd я мог бы отправить ключ без фокуса. Благодарю.