2015-05-07 3 views
0

Я пытаюсь имитировать левый щелчок мыши для объекта InternetExplorer, даже если объект IE является фоновым окном. Системная функция, которую я использую, - SendMessage. Ниже приведен соответствующий код.SendMessage не работает с объектом InternetExplorer

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

InternetExplorer IE = new InternetExplorer(); 
IntPtr handle = (IntPtr) IE.HWND; 

int x = 50; 
int y = 50; 
IntPtr lParam = (IntPtr)((y << 16) | x); // X and Y coordinates of the click 
IntPtr wParam = IntPtr.Zero; 

const uint downCode = 0x0201; 
const uint upCode = 0x202; 
SendMessage(handle, downCode, wParam, lParam); // mousedown 
SendMessage(handle, upCode, wParam, lParam); // mouseup 

Я точно знаю, что указанная позиция создаст новое окно IE при щелчке левой кнопкой мыши. Однако этого не происходит, используя код выше. Итак, что мне здесь не хватает?

обновление
ОС - Windows 7 Professional. IDE - это Visual Studio 2013 Pro.

Я также попытался добавить манифест и указать UIAccess = "true" на this page. Но это не сработало.

+0

FYI Есть более эффективные способы вызова кликов по элементам (через DOM), если это ваше намерение –

+0

Спасибо, Алекс. Я обязательно попробую DOM-подход. Однако, тем не менее, я все еще хотел бы понять, почему SendMessage не работает. – JBT

+1

Ответ здесь: http://stackoverflow.com/a/3443518/932282, а также: http://stackoverflow.com/a/7121314/932282 – mhu

ответ

2

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

Дополнительная информация: here, here и here.

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