Отправка нажатий клавиш в приложение, которое не на переднем плане (т.е. свернуто - PullRequest
1 голос
/ 27 февраля 2010

Я искал рабочий пример того, как этого добиться, но пока не повезло.

Это то, что у меня сейчас есть:

 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr
        wParam, IntPtr lParam);

Process[] processlist = Process.GetProcesses();

            foreach (Process p in processlist)
            {
                if (p.ProcessName == "notepad")
                {
                    //MessageBox.Show("bu");
                    /*

                    LRESULT PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

                    WM_KEYDOWN
                           WPARAM wParam
                            LPARAM lParam;
                    Parameters
                        wParam
                            Specifies the virtual-key code of the nonsystem key. 
                        lParam
                            Specifies the repeat count, scan code, extended-key flag, 
                            context code, previous key-state flag, and transition-state flag, 
                            as shown in this table.

                    ......So......

                    LRESULT debugvalue = PostMessage( Handle_to_where_the_message_is_going,
                                                      WM_KEYDOWN, (WPARAM)VK_ENTER, (LPARAM)0)


                     */
                    uint WM_KEYDOWN = 0x0100;
                    PostMessage(p.Handle, WM_KEYDOWN, Marshal.StringToHGlobalAuto("something"), IntPtr.Zero);
                }
            }

Теперь, что я делаю не так?

http://msdn.microsoft.com/en-us/library/ms646280%28VS.85%29.aspx Может помочь

1 Ответ

2 голосов
/ 27 февраля 2010

Много чего не так. Вы отправляете сообщение в Process.Handle вместо дескриптора окна. Используйте хотя бы Process.MainWindowHandle. Кроме того, вы должны отправить виртуальное нажатие клавиши, а не строку. Перечисление ключей дает вам коды ключей. Отправка строки требует нажатия клавиши для каждой буквы в строке. Также вам следует отправить сообщение WM_KEYUP. Кроме того, принимающее приложение, вероятно, будет использовать состояние клавиатуры, чтобы определить, нажаты ли клавиши Shift, Ctrl или Alt, и соответствующим образом преобразовать нажатие клавиши в клавишу ввода. Вы не можете подделать это с PostMessage ().

Это должно заставить его работать. Чтобы сделать его действительно надежным, я думаю, что вам нужен хук WH_JOURNALPLAYBACK, установленный SetWindowsHookEx (). Вы не можете написать это в C #, он не поддерживает внедрение DLL в другой процесс. Посмотрите, что AutoHotkey может сделать для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...