c#抓取网页数据(【案例分析】模拟键盘程序,为什么不用挂机程序?)
优采云 发布时间: 2021-10-31 14:12c#抓取网页数据(【案例分析】模拟键盘程序,为什么不用挂机程序?)
内容
前言
真正的想法是用C#GUI开发一个自动化测试软件,可以帮我完成500台电脑在线网络答题的压力测试。既要能自动定位并点击鼠标,还要能模拟用键盘输入字符信息。但实际上,想法很饱满,现实很骨感。还有一些问题需要解决。但是在完成这个项目的过程中,也产生了一些副产品,这也是相当有成就感的。现针对开发过程中出现的问题,查找并筛选一些经过测试的参考资料,将我们的理解和研究经验奉献给大家。特提供一个完整的例子:出现在线挂机对话框,按回车继续。创建了一个简单的“连接程序”来开始对话。希望大家一起开放思路,一起研究。
温馨提示:以下为本文文章内容,以下案例可供参考
一、程序界面(如下图)
名称:模拟键盘程序,为什么不用挂机程序,因为它的功能弱,范围窄,而且作为副产品,真的不是挂机用的。请注意,我们的目标是自动化网络测试。
二、使用说明1.接口说明
1. 应用程序路径,这里是FireFox浏览器,所以需要放程序的地址。
2.网站地址:符合URL格式的可直接访问的本地文件或网址
3.浏览器标题:FireFox程序隐藏了应用标题,如果看到标题栏显示:test
其实应用的标题应该是:Test——Mozilla Firefox
4.【启动浏览器】其实这个功能目前可以完全忽略,直接手动启动FireFox即可。
5.【开始】按钮是精华,这里会根据【浏览器标题】的内容进行搜索
到真正的【句柄】在FireFox上浏览网页,如果找到,会显示【句柄】的十进制整数值。如果显示为 0,则表示未找到。
6.【停止】关闭定时器操作。
2.使用注意事项
1. 显示[Handle]位置后,必须为非零值。如果为0,修改【浏览器标题】的内容,再次点击【开始】
2.FireFox 浏览器必须保持在所有表单的前面
3.保证【电脑】不会进入【睡眠】或进入【屏幕保护】状态
三、程序开发流程1.测试网页
1.文件名:test.html
2.网页代码(如下):
测试
alert("ok");
2.程序完整代码
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
namespace 模拟键盘
{
public partial class Form1 : Form
{
[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
public static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string IpClassName, string IpWindowName);
//查找窗体控件
public int iSeconds=30;
public delegate bool CallBack(int hwnd, int lParam);
public Process Proc = new Process();
public System.Windows.Forms.Timer myTimer;
public Form1()
{
InitializeComponent();
}
private void btnBrowser_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "*.exe|*.exe|所有文件|*.*";
openFileDialog1.FileName = "";
DialogResult dr = openFileDialog1.ShowDialog();
if(DialogResult.OK==dr)
{
txtFile.Text = openFileDialog1.FileName;
}
}
string str = "Message";
int iP = 0;
private void btnStart_Click(object sender, EventArgs e)
{
IntPtr hnd = FindWindow(null, txtTitle.Text);//获取句柄
lblMessage.Text = hnd.ToString();
iSeconds = int.Parse(txtSeconds.Text.Trim());
myTimer.Interval = 1000 * iSeconds; //1秒=1000毫秒
myTimer.Enabled = true;
}
private void Form1_Load(object sender, EventArgs e)
{
myTimer = new System.Windows.Forms.Timer();//实例化Timer定时器
myTimer.Tick += new EventHandler(CallBack2);//定时器关联事件函数
}
private void CallBack2(object sender,EventArgs e)//定时器事件
{
keybd_event(Keys.Return, 0, 0, 0);//模拟键盘输入:回车
}
private void btnStop_Click(object sender, EventArgs e)
{
myTimer.Enabled = false;//禁止定时器
}
private void btnStartBrowser_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(txtFile.Text)) return;
try
{
// 浏览器程序启动线程
Proc = new System.Diagnostics.Process();
Proc.StartInfo.FileName = txtFile.Text;
Proc.StartInfo.Arguments = txtNetAddr.Text; //浏览器打开URL参数
Proc.StartInfo.UseShellExecute = false;
Proc.StartInfo.RedirectStandardInput = true;
Proc.StartInfo.RedirectStandardOutput = true;
Proc.Start();
}
catch
{
Proc = null;
}
}
}
}
四、程序开发中的一些其他思路和问题1.使用已知进程获取主窗口句柄然后遍历子窗口句柄
以下代码与本程序无关,为片段,请勿直接复制使用,主要提供给有兴趣改进的人参考。
if (string.IsNullOrEmpty(txtFile.Text)) return;
try
{
Proc = new System.Diagnostics.Process();
Proc.StartInfo.FileName =txtFile.Text;
Proc.StartInfo.Arguments = txtNetAddr.Text;
Proc.StartInfo.UseShellExecute = false;
Proc.StartInfo.RedirectStandardInput = true;
Proc.StartInfo.RedirectStandardOutput = true;
Proc.Start();
Thread.Sleep(2000);
}
catch
{
Proc = null;
}
if (Proc.MainWindowHandle != null)
{
//调用 API, 传递数据
while (Proc.MainWindowHandle == IntPtr.Zero)
{
Proc.Refresh();
}
while (Proc.MainWindowHandle == IntPtr.Zero)
{
Proc.Refresh();
}
//执行代码略
}
【问题描述】:这里的线程是Proc,但是这个线程不是主窗口。该线程的主窗口句柄需要通过 Proc.MainWindowHandle 获取。在使用过程中,很容易获取到自己开发的C#GUI程序,对【记事本】程序来说是正常的,但是在【Chrome】浏览器上使用时,结果不是0就是异常. 【FireFox】有时能正常获取,有时异常。
2. C#操作API函数网上搜索很少,不完整
这里有一个API函数查询网站,基本上一口气把API函数用完了。#
3.如果想查看Windows下的API函数,也可以使用工具:
1.DLL 函数查看器
2.DLL 导出查看器
4.获取申请表工具软件的句柄、标题和类型
这里可以使用VS环境下的Spy++(C++)。
写在最后
关于C#中API函数的使用,由于个人喜好不同,参数类型也有很大差异。真正体验的文章相对较少。谬误更难解决。后期准备深入体验,同时准备写文章系列。虽然作者的能力有限,到时候肯定会有很多谬论,但作者坚持所有的内容都是以实践为导向的。程序必须经过调试和通过,才能放到网上。志同道合的读者不妨关注作者的博客,敬请期待,我们下期再见!
关于C#制作网站挂钩程序文章的实现本文到此结束。更多C#相关网站挂机程序内容,请搜索Script Home k7@的上一个或继续浏览下方相关文章,希望大家多多支持Scripthome未来!