Имитация перемещения мыши / нажатия / нажатия клавиш в приложении, которое не активно - PullRequest
3 голосов
/ 30 апреля 2009

Я знаю, как имитировать события мыши и клавиатуры, но они действуют так, как если бы пользователь сделал их, поэтому они влияют на активное окно. Мне нужно смоделировать один из этих входов, но в окне, которое не активно.

Я не говорю, что он свернут, представьте себе, например, у вас есть msPaint и блокнот. Блокнот перед краской. И вы хотите смоделировать щелчки мыши в определенных координатах окна рисования, но не устанавливая его активным, позволяя пользователю продолжать использовать блокнот, который находится перед краской.

Возможно ли это вообще? Спасибо!

Я пробовал это:

            const int WM_KEYDOWN = 0x100;
        Thread.Sleep(5000);
        Process x = Process.Start(@"C:\WINDOWS\NOTEPAD.EXE");
        PInvokes.PlatformInvokeUSER32.SendMessage(x.MainWindowHandle, WM_KEYDOWN, ((int)Keys.W), 0);

но это не работает = (Ничего не делает: (

Ответы [ 4 ]

2 голосов
/ 30 апреля 2009

Возможно, вместо этого попробуйте использовать функцию PostMessage:

    [DllImport("user32.dll", CharSet=CharSet.Auto)] 
    private static extern int PostMessage(
            int hWnd, int msg, int wParam, IntPtr lParam);
2 голосов
/ 30 апреля 2009

Вы можете попробовать API автоматизации пользовательского интерфейса . Он поддерживает также устаревшие приложения.

1 голос
/ 16 декабря 2009

В зависимости от целевого приложения может возникнуть много проблем. Некоторые приложения запускаются на WM_KEYDOWN или WM_KEYUP вместо WM_CHAR. Кроме того, ключ уже может быть недоступен и игнорируется. Для целей, таких как веб-браузеры, вам нужно получить правильный дескриптор окна. Winspector может получить это для вас.

0 голосов
/ 01 ноября 2011

Ваш код не будет работать, потому что SendMessage требует, чтобы окно, которое вы отправляете, было активным. Попробуйте PostMessage.

...