我一直在尝试使用PostMessage()
将鼠标点击发送到表单内的WebBrowser控件,我遇到了一个相当重要的问题。我想要实现的是在我的表单最小化时模拟这个WebBrowser上的鼠标点击。通常PostMessage()
可以正常工作,但它似乎只有在我的表单具有焦点时才有效。这让我相信,在处理鼠标事件之前,有一些检查是否正在加载到我的WebBrowser控件中的特定网站是否处于焦点。
这是我用我的程序发送点击的方式:
private void SendClick(Point location)
{
resetHandle = true;
StringBuilder className = new StringBuilder(100);
while (className.ToString() != "Internet Explorer_Server")
{
handle = GetWindow(handle, 5); // 5 == child
GetClassName(handle, className, className.Capacity);
//MessageBox.Show(className.ToString());
}
IntPtr lParam = (IntPtr)((location.Y << 16) | location.X);
IntPtr wParam = IntPtr.Zero;
const uint downCode = 0x201;
const uint upCode = 0x202;
const uint moveCode = 0x200;
PostMessage(handle, moveCode, wParam, lParam); //move mouse
PostMessage(handle, downCode, wParam, lParam); // mousedown
PostMessage(handle, upCode, wParam, lParam); // mouseup
}
这就是resetHandle的作用:
private void timer3_Tick(object sender, EventArgs e)
{
if (resetHandle == true)
{
handle = webBrowser1.Handle;
resetHandle = false;
}
}
我不确定是否有更好的方法将鼠标事件发送到后台窗口,我对任何想法持开放态度。我真正想问的是,当它实际上仍然是最小化时,是否有可能让窗口相信它是焦点?
任何帮助都会非常感激!
答案 0 :(得分:1)
不是让窗口保持最小化,而是保持正常(恢复),但设置其X或Y坐标,使其位于屏幕外。
如果您想让用户觉得最小化和恢复它,请使用HwndSource.AddHook来监听SC_MINIMIZE。在HwndSourceHook
处理程序中,根据伪最小化状态在屏幕上或屏幕外移动窗口,并将handled
设置为true。