gpt4 book ai didi

c# - 使用 PostMessage/SendMessage 将 key 发送到 c# IE WebBrowser

转载 作者:行者123 更新时间:2023-11-30 15:03:34 25 4
gpt4 key购买 nike

我正在尝试在 C# webbrowser 控件和选项卡中自动填写值,然后输入并按上下键在字段中移动。

这是我的 PInvoke 和包装函数。我使用 Spy++ 在 Internet Explorer 中获取这些。有人看到我的定义有什么问题吗?我想使用 Send 和 Post 消息而不是 SendInput,因为我不想让窗口聚焦...

    [DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

const uint WM_KEYDOWN = 0x0100;
const uint WM_KEYUP = 0x0101;
const uint WM_CHAR = 0x0102;
const int VK_TAB = 0x09;
const int VK_ENTER = 0x0D;
const int VK_UP = 0x26;
const int VK_DOWN = 0x28;
const int VK_RIGHT = 0x27;

//According to SPY++ in IE

//ENTER key is
// P KEYDOWN
// P CHAR
// S CHAR
// P KEY_UP

//TAB key is
// P KEYDOWN
// P KEYUP

//DOWN, UP, RIGHT, LEFT is
// P KEYDOWN
// S KEYDOWN
// P KEYUP

//Letters is
// P KEYDOWN
// S KEYDOWN
// P CHAR
// S CHAR
// P KEYUP

private void SendEnter()
{
PostMessage(this.Handle, WM_KEYDOWN, (IntPtr)VK_ENTER, IntPtr.Zero);
PostMessage(this.Handle, WM_CHAR, (IntPtr)VK_ENTER, IntPtr.Zero);
SendMessage(this.Handle, WM_CHAR, (IntPtr)VK_ENTER, IntPtr.Zero);
PostMessage(this.Handle, WM_KEYUP, (IntPtr)VK_ENTER, IntPtr.Zero);
}

private void SendTab()
{
PostMessage(this.Handle, WM_KEYDOWN, (IntPtr)VK_TAB, IntPtr.Zero);
PostMessage(this.Handle, WM_KEYUP, (IntPtr)VK_TAB, IntPtr.Zero);
}


private void SendArrowKey(int key)
{
PostMessage(this.Handle, WM_KEYDOWN, (IntPtr)key, IntPtr.Zero);
SendMessage(this.Handle, WM_KEYDOWN, (IntPtr)key, IntPtr.Zero);
PostMessage(this.Handle, WM_KEYUP, (IntPtr)key, IntPtr.Zero);
}

private void SendChar(int key)
{
//Keydown wParam values are 0x020 less than WM_CHAR wParam
PostMessage(this.Handle, WM_KEYDOWN, (IntPtr)(key - 0x020), IntPtr.Zero);
SendMessage(this.Handle, WM_KEYDOWN, (IntPtr)(key - 0x020), IntPtr.Zero);
PostMessage(this.Handle, WM_CHAR, (IntPtr)key, IntPtr.Zero);
SendMessage(this.Handle, WM_CHAR, (IntPtr)key, IntPtr.Zero);
PostMessage(this.Handle, WM_KEYUP, (IntPtr)(key - 0x020), IntPtr.Zero);
}

最佳答案

首先,我建议您拥有 WebBrownser 文档的句柄:

        IntPtr pControl; 
IntPtr pControl2;
pControl = FindWindowEx(WebWindow.Handle, IntPtr.Zero, "Shell Embedding", IntPtr.Zero);
pControl = FindWindowEx(pControl, IntPtr.Zero, "Shell DocObject View", IntPtr.Zero);
pControl = FindWindowEx(pControl, IntPtr.Zero, "Internet Explorer_Server", IntPtr.Zero);
pControl2 = FindWindowEx(pControl, IntPtr.Zero, "MacromediaFlashPlayerActiveX", IntPtr.Zero);

if (pControl2 != IntPtr.Zero)
pControl = pControl2;
break;
return pControl;

使用该句柄发送您的关键信息。

我个人所做的是,我向盒子位置的那个句柄发送一个点击,然后发送我的 key

        PostMessage(pControl , (uint)MouseMessages.WM_MOUSEMOVE, 0, MAKELPARAM(x.X, x.Y));
PostMessage(pControl , (uint)MouseMessages.WM_LBUTTONDOWN, 0, MAKELPARAM(x.X, x.Y));
PostMessage(pControl , (uint)MouseMessages.WM_LBUTTONUP, 0, MAKELPARAM(x.X, x.Y));

像这样使用 MAKELPARAM:

    private int MAKELPARAM(int p, int p_2)
{
return ((p_2 << 16) | (p & 0xFFFF));
}

我看到在非 Flash 文档上找到的一件事是发送 WM_CHAR 只有效。

有了这一切,您就不必拥有窗口焦点了

希望对你有所帮助:)

关于c# - 使用 PostMessage/SendMessage 将 key 发送到 c# IE WebBrowser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11368648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com