Использование post/sendmessage для щелчков мышью не работает

Возможный дубликат:
Как имитировать щелчок мышью на С#?

я пытался

Window = FindWindow(null, "untitled - Paint");
PostMessage(WindowToFind, WM_MOUSEMOVE, 0, location); 
PostMessage(WindowToFind, WM_LBUTTONDOWN, ((int)Keys.LButton), location);

местоположение 100 * 0x10000 + 100 для 100x100 и т. д. Я сомневаюсь, что это неправильно. Пробовал поменять местами ((int)Keys.LButton) на 0, не помогло. Я попытался поместить thread.sleep между lbuttondown и lbuttonup (хорошо, постсообщение должно ждать без thread.sleep, но что угодно) Я использую 0x0200 для перемещения мыши и 0x0202 для констант левой кнопки.

Без понятия, почему это вообще не работает.


person john_smith_kl    schedule 30.11.2012    source источник
comment
ты пробовал это? stackoverflow.com/questions/2416748 /   -  person Arsen Mkrtchyan    schedule 01.12.2012
comment
для этого требуется, чтобы окно было впереди и фактически щелкало. я пытаюсь смоделировать это. (Я только что прочитал код, не видел никаких окон, поэтому могу ошибаться) Тем не менее, спасибо.   -  person john_smith_kl    schedule 01.12.2012


Ответы (1)


Это правильно. Функции PostMessage и SendMessage никогда не предназначались для синтеза мыши ( или клавиатура) события. Иногда они могут работать для этого, но не стоит полагаться на это, потому что большую часть времени они не работают.

Вместо этого для правильного синтезировать мышиные события. Как и в случае с другими функциями Win32 API, вам потребуется P/Invoke, чтобы вызвать ее из C#. Это определение можно сгенерировать вручную из документации или легко найти в Интернете. Единственная сложная часть заключается в том, что вам нужно объявить соответствующие структуры, а также саму функцию.

mouse_eventфункция также существует в дополнение к SendInput как способ синтезировать события мыши, но, как ясно из связанной документации, эта функция устарела в пользу SendInput. Вы всегда должны использовать SendInput в новых приложениях.

Единственная загвоздка в том, что вы пытаетесь отправить эти события мыши в другое приложение. Это создаст небольшую проблему, так как SendInput просто вводит события в поток клавиатуры/мыши. Приложение, которое их обрабатывает, будет окном переднего плана. Таким образом, вам нужно сначала установить фокус на другое окно и убедиться, что вы не нарушаете UIPI.

Однако код, который у вас есть, относительно хрупок на другом уровне: окна Paint меняют свое имя, как только вы сохраняете документ под другим именем. И это предполагает, что Windows 9 не переименовывает Paint во что-то другое — это случалось раньше, когда приложение называлось «Кисть». Надеюсь, это всего лишь пример того, чего вы пытаетесь достичь. В любом случае, я могу порекомендовать вам изучить более надежные методы автоматизации (например, Microsoft UI Automation framework) вместо слепого ввода.

person Cody Gray    schedule 30.11.2012
comment
О, я только что попробовал это с краской. sendinput, кажется, требует фокуса, извините, если я неправильно понял. Можете ли вы разработать надежные методы автоматизации? Автоматизация пользовательского интерфейса кажется несвязанной, поскольку я читал, что это просто автоматическая модификация пользовательского интерфейса? - person john_smith_kl; 01.12.2012