C#制作网站挂机程序的实现示例

目录
  • 前言
  • 一、程序界面(如下图)
  • 二、使用说明
    • 1.界面说明
    • 2.使用注意点
  • 三、程序开发过程
    • 1.测试网页
  • 四、程序开发的一些其它思路及问题
    • 1.采用通过已知进程获取主窗口句柄再遍历子窗口句柄
    • 2.网上搜索C#操作API函数的东西很少,且不完整
    • 3.如果想查看Windows下的API函数,还可以使用工具:
    • 4.获取应用程序窗体的句柄、标题、类型的工具软件
  • 写在最后

前言

真实的想法是用C#GUI开发一个自动化测试的软件,能帮助我完成500台计算机在线网络答题的压力测试。既要能自动鼠标定位单击操作,也能键盘模拟输入字符信息。但其实想法很丰满,现实很骨感。目前还有一些问题有待于解决。但在完成这个项目的过程中,也产生了一些副产品,也是挺有成就感的。现就开发过程中出现的问题,找到并甄别测试过的一些参考资料,理解和研究心得奉献给大家。特别奉献一个完整的例子:针对网上挂机出现对话框,按回车才能继续。制作了一个简单的“挂机程序”,以此抛砖引玉。希望大家广开思路,共同研究。

提示:以下是本篇文章正文内容,下面案例可供参考

一、程序界面(如下图)

名称:模拟键盘程序,为什么不用挂机程序,是因为其功能弱小,针对的范围窄,而且,它作为副产品,真心不是为挂机而作。请注意我们的目标是:自动化网络测试。

二、使用说明

1.界面说明

1.应用程序路径,这里针对FireFox浏览器,所以需要放程序的地址。
2.网站地址:符合URL格式的能直接访问的本地文件或者网址
3.浏览器标题:FireFox程序已经对应用程序标题作了隐藏,如果看到标题栏显示:测试
其实应用程序的标题应该是:测试 — Mozilla Firefox
4.【启动浏览器】其实这个功能目前完全可以不去管,直接手动启动FireFox即可。
5.【Start】按钮才是本质,这里将根据【浏览器标题】内容来查找
到FireFox浏览网页的真正【句柄】,另外如果找到,将显示【句柄】的十进制整数值,如果显示0,表示未找到。
6.【Stop】将定时器操作禁用。

2.使用注意点

1.显示【句柄】位置启动后,必须是非零值,如果是0,则修改【浏览器标题】内容,重新点【Start】
2.必须保持FireFox浏览器在所有窗体的前面
3.保证【计算机】不会进入【睡眠】或者进入【屏幕保护】状态

三、程序开发过程

1.测试网页

1.文件名:test.html
2.网页代码(如下):

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>测试</title>
	<meta charset="utf-8" />
</head>
<body>
    <script language="javascript">
        alert("ok");
    </script>
</body>
</html>

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函数一网打尽了。http://pinvoke.net/#

3.如果想查看Windows下的API函数,还可以使用工具:

1.DLL函数查看器

2.DLL Export Viewer

4.获取应用程序窗体的句柄、标题、类型的工具软件

这里可以使用VS环境(C++)中的Spy++。

写在最后

有关于C#使用API函数,因为个人爱好不同,参数类型也是千差万别。真正的体验类的文章也比较少。谬误就更难解决了。后期,准备作一深入体验,同时准备写一个系列文章。虽然笔者能力有限,到时谬误肯定也不少,但笔者坚持所有内容注重实践。程序必须调试通过,正常才会放到网上。有志同道合的读者不妨关注一下笔者博客,敬请期待,下期再见!

到此这篇关于C#制作网站挂机程序的实现示例的文章就介绍到这了,更多相关C# 网站挂机程序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# Fiddler插件实现网站离线浏览功能

    有这么一种应用场景: 你是做前端或APP开发的,需要调用服务端提供的接口,接口只能在公司内网访问:在公司外就无法调试代码了. 想在公司外访问怎么办呢? 如果在公司的时候将所有接口的响应内容都保存起来,就可以脱离服务端在本地模拟出来一个服务端环境,从而就可以不受网络环境的限制愉快的调试代码了. 实现原理如下: 先用Fiddler抓包,把你需要保存的接口(不仅限接口,html,css,js,image均可)都抓一遍. 在Fiddler中依次单击如下菜单 File -> Save -> All Se

  • C# 实现抓取网站页面内容的实例方法

    抓取新浪网的新闻栏目,如图所示: 使用 谷歌浏览器的查看源代码: 通过分析得知,我们所要找的内容在以下两个标签之间: 复制代码 代码如下: <!-- publish_helper name='要闻-新闻' p_id='1' t_id='850' d_id='1' --> 内容.... <!-- publish_helper name='要闻-财经' p_id='30' t_id='98' d_id='1' --> 如图所示: 内容.... 使用VS建立一个如图所示的网站: 我们下载

  • C# 关于爬取网站数据遇到csrf-token的分析与解决

    需求 某航空公司物流单信息查询,是一个post请求.通过后台模拟POST HTTP请求发现无法获取页面数据,通过查看航空公司网站后,发现网站使用避免CSRF攻击机制,直接发挥40X错误. 关于CSRF 读者自行百度 网站HTTP请求分析 Headers Form Data 在head里包含了cookie 与 x-csrf-token  formdata 里包含了_csrf (与head里的值是一样的). 这里通过查看该网站的JS源代码发现_csrf 来自于网页的head标签里 猜测cookie与

  • 英雄联盟辅助lol挂机不被踢的方法(lol挂机脚本)

    调用API设置鼠标位置并模拟鼠标右键让人物走动,全局钩子等 复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text; using System.Windows.Forms;using System.Runtime.InteropServices;using System.Threading; namespace LOLSetCursor{    public cla

  • C#使用正则表达式抓取网站信息示例

    本文实例讲述了C#使用正则表达式抓取网站信息的方法.分享给大家供大家参考,具体如下: 这里以抓取京东商城商品详情为例. 1.创建JdRobber.cs程序类 public class JdRobber { /// <summary> /// 判断是否京东链接 /// </summary> /// <param name="param"></param> /// <returns></returns> public

  • C#导出网站功能实例代码讲解

    这个导出网站功能指通过前台javascript触发进入ashx函数中,实现将服务器中某个文件夹(包含其子文件夹和文件)通通复制到服务器中另一处位置,当然该文件夹本身就是一个网站.所以导出网站最重要的两个功能,除了javascript的触发,就是C#ashx文件复制文件夹的操作. 下面这段代码就是通过javascript的Request函数调用copy.ashx函数文件,实现将需要复制的文件夹的子路径和复制到所在位置的子路径的两个参数传进去后台函数getWebList函数就是后台的一个函数,这个函

  • C#如何控制IIS动态添加删除网站详解

    我的目的是在Winform程序里面,可以直接启动一个HTTP服务端,给下游客户连接使用. 查找相关技术,有两种方法: 1.使用C#动态添加网站应用到IIS中,借用IIS的管理能力来提供HTTP接口.本文即对此做说明 2.在Winform程序中实现Web服务器逻辑,自己监听和管理客户端请求: 利用IIS7自带类库管理IIS现在变的更强大更方便,而完全可以不需要用DirecotryEntry这个类了(乐博网中很多.net管理iis6.0的文章都用到了DirecotryEntry这个类 ),Micro

  • c#实现网站监控查看是否正常示例

    代码如下: 复制代码 代码如下: public void MonitorWeb(Model.ServiceInfo mServerInfo) { var sUrl = mServerInfo.ServiceConfig; var mLogInfo = new Model.LogInfo { ServiceId = mServerInfo.ServiceId }; try { var mWebRequest = (HttpWebRequest)WebRequest.Create(sUrl); va

  • C#制作网站挂机程序的实现示例

    目录 前言 一.程序界面(如下图) 二.使用说明 1.界面说明 2.使用注意点 三.程序开发过程 1.测试网页 四.程序开发的一些其它思路及问题 1.采用通过已知进程获取主窗口句柄再遍历子窗口句柄 2.网上搜索C#操作API函数的东西很少,且不完整 3.如果想查看Windows下的API函数,还可以使用工具: 4.获取应用程序窗体的句柄.标题.类型的工具软件 写在最后 前言 真实的想法是用C#GUI开发一个自动化测试的软件,能帮助我完成500台计算机在线网络答题的压力测试.既要能自动鼠标定位单击

  • PHP网站安装程序制作的原理、步骤、注意事项和示例代码

    1.制作PHP安装程序的原理 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安装完成后需要修改安装文件. 2. 制作PHP安装程序的步骤 step1 检查目录或文件的权限 step2 修改或填加配置文件 step3 检查配置文件正确性 step4 导入数据库 step5 锁定或删除安装文件 3.制作安装用到的PHP函数 检查文件是否可写,返回布尔值:is_writable("data/con

  • 制作微信小程序的小白简单入门教程

    目录 一.小程序是什么? 二.小程序的优势 三.知识准备 四.开发准备 五. hello world 示例 六.WXML 标签语言 七.小程序的项目结构 八.项目配置文件 app.json 小程序已经成为国内前端的一个重要业务,跟 Web 和手机 App 有着同等的重要性.小程序开发者供不应求,市场招聘需求极其旺盛,企业都抢着要. 尽管如此,小程序的教程却很缺,要么是不够系统,要么就是跳跃性太大,很多关键的地方寥寥数语,初学者摸不着头脑.我自己学的时候,就苦于找不到好一点的教程. 本文就是我的小

  • python 制作网站筛选工具(附源码)

    一.思路 1.整体思路 2.代码思路 思路很简单,就是用python发送请求,提取响应体中的状态码加以判断,最后保存到本地txt文本中,以实现网站信息的筛选. 二.撰写代码 import time import requests import urllib3 from concurrent.futures import ThreadPoolExecutor #取源文件中的网址并且去重 def get_url(old_file): with open(old_file,'r',encoding='

  • Python一行代码快速实现程序进度条示例

    目录 引言 1.先上代码 2.使用说明 3.实现原理 引言 你在写代码的过程中,有没有遇到过以下问题? 已经写好的程序,想看看程序执行的进度? 在写代码批量处理文件的时候,如何显示现在处理到第几个文件了? 如上图所示的进度条是一个最好的解决方法,怎么在不修改原来代码的情况下,快速给程序加一个进度条呢? 今天我们来学习一个最简单的方法~ 1.先上代码 下载进度条的第三方库. pip install poprogress 使用这个库,快速制作进度条 from poprogress import si

  • Hadoop编程基于MR程序实现倒排索引示例

    相信接触过搜索引擎开发的同学对倒排索引并不陌生,谷歌.百度等搜索引擎都是用的倒排索引,关于倒排索引的有关知识,这里就不再深入讲解,有兴趣的同学到网上了解一下.这篇博文就带着大家一起学习下如何利用Hadoop的MR程序来实现倒排索引的功能. 一.数据准备 1.输入文件数据 这里我们准备三个输入文件,分别如下所示 a.txt hello tom hello jerry hello tom b.txt hello jerry hello jerry tom jerry c.txt hello jerr

  • 使用electron制作满屏心特效的示例代码

    本文介绍了使用electron制作满屏心特效的示例代码,分享给大家,具体如下: 图片被压缩了 看起来很难看 主进程代码 import {BrowserWindow, app, ipcMain} from 'electron' createWindow(); ipcMain.on('quitApp', () => { app.quit(); }); function createWindow() { const loginURL = process.env.NODE_ENV === 'develo

  • 在IPython中执行Python程序文件的示例

    简单使用了一下之后,我觉得如果有机会(公司里面编码是极不自由的,也无所谓,我在公司不做数据分析),我肯定是更喜欢使用IPython作为我的Python shell环境了.简单的接触发现了不少我喜欢的功能.其中,在这种命令模式下能够方便地调用Python文件以及能够识别部分物理磁盘路径信息就是我比较喜欢的. 在IPython中集成了几个常用的shell命令,用起来确实感觉顺手了不少.之前偶尔需要用到跟操作系统交互的时候,我都是通过引用os模块. 下面是一个简单的小例子: In [18]: pwd

  • electron制作仿制qq聊天界面的示例代码

    本文介绍了electron制作仿制qq聊天界面的示例代码,分享给大家,具体如下: 效果图: 样式使用scss和flex布局 这也是制作IM系统的最后一个界面了! 在制作之前参考了qq和千牛 需要注意的点 qq将滚动条美化了 而且在无操作的情况下是不会显示的 滚动条美化 ::-webkit-scrollbar { /*滚动条整体样式*/ width: 5px; /*高宽分别对应横竖滚动条的尺寸*/ height: 1px; } ::-webkit-scrollbar-thumb { /*滚动条里面

  • 开发Node CLI构建微信小程序脚手架的示例

    本文介绍了 Node CLI 构建微信小程序脚手架的示例,分享给大家,具体如下: 目的 由于目前公司的 TOC 产品只要是微信小程序,而且随着业务的扩展, 会有更多的需求,创建更多的小程序,为了让团队避免每次开发前花费大量时间做比如工程化的一些配置,以及保持每个项目的一致性, 所以决定做一个 Node CLI 来创建微信小程序脚手架 节省开发前期的大量时间,新项目可以很快开始业务开发 保证项目统一性,有利于团队间的协作及工程化 提升团队基建意识,从枯燥无味的业务开发中脱离出来,尝试新的东西,即使

随机推荐