c# api 模拟按钮点击问题,高手请进!
[DllImport("user32", EntryPoint = "SetParent", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32", EntryPoint = "FindWindowA", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", EntryPoint = "SendMessageA", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
private static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd,int Msg, IntPtr wParam, string lParam);
private const int WM_GETTEXT = 0x000D;
private const int WM_SETTEXT = 0x000C;
private const int WM_CLICK = 0x00F5;
[DllImport("shell32.dll", EntryPoint = "ShellExecuteA", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
private static extern int ShellExecute(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
private const int WM_SYSCOMMAND = 0x112;
private const int SC_MAXIMIZE = 0xF030;
private const int SC_MINIMIZE = 0xF020;
private const int SC_RESTORE = 0xF120;
public const int SW_HIDE = 0;
public const int SW_SHOW = 5;
[DllImport("user32.dll ", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
private static extern int ShowWindow(int hwnd, int nCmdShow);
private void timer1_Tick(object sender, EventArgs e)
{
IntPtr h = FindWindow("#32770", "东北证券通达信V6.03");
SetParent(h, this.panel1.Handle); //嵌套到panel1内
SendMessage(h.ToInt32(), WM_SYSCOMMAND, SC_MAXIMIZE, 0);
ShowWindow(h.ToInt32(), SW_SHOW);
timer1.Enabled = false;
//得到控件
IntPtr MIMA = new IntPtr(0);
IntPtr YZMA = new IntPtr(0);
IntPtr DL = new IntPtr(0);
if (!h.Equals(IntPtr.Zero))
{
//得到控件子窗体,并设置其内容
MIMA = FindWindowEx(h, MIMA, "SafeEdit", null);
if (!MIMA.Equals(IntPtr.Zero))
{
//调用SendMessage方法设置其内容
SendMessage(MIMA, WM_SETTEXT, h, "123456");
}
YZMA = FindWindowEx(h, MIMA, "SafeEdit", null);
if (!YZMA.Equals(IntPtr.Zero))
{
//调用SendMessage方法设置其内容
SendMessage(YZMA, WM_SETTEXT, h, "123456");
}
//按钮点击
DL = FindWindowEx(h, DL, "AfxWnd42", null);
if (!DL.Equals(IntPtr.Zero))
{
SendMessage(DL, WM_CLICK, h, "0");
}
}
}
为什么这个点击没有执行呢??
[解决办法]
一不小心
菜鸟就进来了
于是
帮你顶一下
[解决办法]
[解决办法]
SendMessage(DL, WM_CLICK, h, "0");
DL和h是不是反了啊
[解决办法]
- C# code
//按钮点击 //DL = FindWindowEx(h, DL, "AfxWnd42", null); DL = FindWindowEx(h, YZMA, "AfxWnd42", null); 或者 DL = FindWindowEx(h, MIMA, "AfxWnd42", null);
[解决办法]
一不小心
菜鸟看到了
于是
帮你顶一下
[解决办法]
如果真的找到了按钮的指针,完全可以用API找到按钮的区域,然后用API把光标挪到那个区域然后模似一个左键单击。
[解决办法]
BM_CLICK是"BUTTON"类的消息,不知道这个"AfxWnd42"类是否响应这个消息。
BM_CLICK消息要求后两个参数都是0,并且按钮所在窗口必须处于激活状态才会响应。
可以试试向父窗口发BN_CLICKED事件(通过WM_COMMAND消息);或者向按钮Post鼠标消息。
[解决办法]
没有做过。顶你一下。
[解决办法]
帮你项
[解决办法]
[解决办法]
这是我早期写的一个测试工具,
你自己看看里面的模拟单击事件的步骤。
枚举窗体控件 发送文本 单击事件
[解决办法]
C++编写。
[解决办法]
应该是 SendMessage(hWnd, BM_CLICK, 0, 0); 一句是发送单击事件的。