c#抓取网页数据(【案例分析】模拟键盘程序,为什么不用挂机程序?)

优采云 发布时间: 2021-10-31 14:12

  c#抓取网页数据(【案例分析】模拟键盘程序,为什么不用挂机程序?)

  内容

  前言

  真正的想法是用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未来!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线