2013-11-18 3 views
1

Я начал процесс и хочу опубликовать на нем сообщение типа PageDown.Как отправить ключ к процессу

Вот код для запуска процесса.

Process.Start("chrome.exe", "D:/sample.htm"); 
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses()) 
{ 
    if (p.ProcessName == "chrome" && p.MainWindowTitle == "sample.htm - Google Chrome") 
    { 
     //how to Send a pagedown key to process p 
    } 
} 

Я создал следующий класс, но я не знаю, почему он не работает?

class KeyHandle 
{ 
    private static Int32 WM_KEYDOWN = 0x100; 
    private static Int32 WM_KEYUP = 0x101; 

    [return: MarshalAs(UnmanagedType.Bool)] 
    [DllImport("user32.dll", SetLastError = true)] 
    static extern bool PostMessage(IntPtr hWnd, int Msg, System.Windows.Forms.Keys wParam, int lParam); 

    public static void SendKey(IntPtr hWnd, System.Windows.Forms.Keys key) 
    { 
     PostMessage(hWnd, WM_KEYUP, key, 0); 
    } 


} 

и называть его таким образом

foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses()) 
{ 
    if (p.ProcessName == "chrome" && p.MainWindowTitle == "sample.htm - Google Chrome") 
    { 
     KeyHandle.SendKey(p.MainWindowHandle, Keys.PageDown); 
    } 
} 
+0

Я редактировал свой титул. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

@JohnSaunders благодарит за улучшение сообщения! У вас есть решение для этого сообщения? – saeed

ответ

1

я переписать код с помощью SendKeys API. Я проверить это работает хорошо

foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses()) 
{ 
    if (p.ProcessName == "chrome" && p.MainWindowTitle == "sample.htm - Google Chrome" && 
     p.MainWindowHandle != IntPtr.Zero) 
    { 
     SetForegroundWindow(p.MainWindowHandle); 
     SendKeys.SendWait("{PGDN}"); 
    } 
} 

Чтобы объявить функцию SetForegroundWindow, использование:

[DllImport("user32.dll")] 
private static extern bool SetForegroundWindow(IntPtr hWnd); 

List of keys

+0

Позвольте мне попробовать! – saeed

+0

Если вы считаете, что этот вопрос полезен, голосуйте, пожалуйста, – saeed

+0

, пожалуйста, проверьте этот вопрос – saeed

0

Process.Start ("chrome.exe", "D: /sample.htm"); Еогеасп (System.Diagnostics.Process р в System.Diagnostics.Process.GetProcesses()) { если (p.ProcessName == "хром" & & p.MainWindowTitle == "sample.htm - Google Chrome") { KeyHandle.SendKey (p.MainWindowHandle, Keys.PageDown); }} Вам необходим этот класс, а

класс KeyHandle { частных статических Int32 WM_KEYDOWN = 0x100; закрытый статический Int32 WM_KEYUP = 0x101;

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("user32.dll", SetLastError = true)] 
static extern bool PostMessage(IntPtr hWnd, int Msg, System.Windows.Forms.Keys wParam, int lParam); 

public static void SendKey(IntPtr hWnd, System.Windows.Forms.Keys key) 
{ 
    PostMessage(hWnd, WM_KEYUP, key, 0); 
} 

}

+0

отредактируйте и исправьте сообщение. – saeed

+0

Это мой ответ, который я предоставил для другого вопроса, но он не работает в win7. Я публикую его, чтобы пользователи могли тестировать код на разных платформах, таких как winxp и vista, а также – saeed

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