[转载]整理分享C#通过user32.dll模拟物理按键操作的代码 - 斯克迪亚 - 博客园

mikel阅读(968)

[转载]整理分享C#通过user32.dll模拟物理按键操作的代码 – 斯克迪亚 – 博客园.

对系统模拟按键方面的知识和按键映射代码做了一下梳理,在这里分享出来,适用于开发自动操作工具和游戏外挂。

主代码:

public const int KEYEVENTF_EXTENDEDKEY = 0x0001; //Key click flag
        public const int KEYEVENTF_KEYUP = 0x0002; //Key up flag
        [DllImport("user32.dll")]
        private static extern void keybd_event(byte bVk, byte bSCan, int dwFlags, int dwExtraInfo);
        [DllImport("user32.dll")]
        private static extern byte MapVirtualKey(byte wCode, int wMap);

        public static void 模拟按下按键(VirtualKeyCode 虚拟按键代码)
        {
            var code = (byte)虚拟按键代码;
            keybd_event(code, 0, 0, 0);
        }

        public static void 模拟弹起按键(VirtualKeyCode 虚拟按键代码)
        {
            var code = (byte) 虚拟按键代码;
            keybd_event(code, 0, KEYEVENTF_KEYUP, 0);
        }

        public static void 模拟单击按键(VirtualKeyCode 虚拟按键代码)
        {
            var code = (byte)虚拟按键代码;
            keybd_event(code, 0, KEYEVENTF_EXTENDEDKEY, 0);
        }

网上关于keybd_event的dwFlags参数功能说法很混乱,经我测试貌似是KEYEVENTF_EXTENDEDKEY表示一次单击,0表示按下,KEYEVENTF_KEYUP表示弹起,不一定完全正确,希望高人指点一下。

另外MapVirtualKey的作用实在不懂,所以就没用上,看到有人这么调用不知有什么区别:

var code = (byte)虚拟按键代码;
            keybd_event(code, MapVirtualKey(code,0), 0, 0);

我试过好像也没什么变化~到底MapVirtualKey是干什么用的呢??

VirtualKeyCode枚举:

/// <summary>
    /// 虚拟按键代码
    /// 参考于 http://msdn.microsoft.com/zh-cn/library/dd375731(v=vs.85).aspx
    /// </summary>
    public enum VirtualKeyCode
    {
        /// <summary>
        /// Left mouse button
        /// </summary>
        Left_mouse_button = 0x01,
        /// <summary>
        /// Right mouse button
        /// </summary>
        Right_mouse_button = 0x02,
        /// <summary>
        /// Control-break processing
        /// </summary>
        Control_break_processing = 0x03,
        /// <summary>
        /// Middle mouse button (three-button mouse)
        /// </summary>
        Middle_mouse_button = 0x04,
        /// <summary>
        /// X1 mouse button
        /// </summary>
        X1_mouse_button = 0x05,
        /// <summary>
        /// X2 mouse button
        /// </summary>
        X2_mouse_button = 0x06,
        /// <summary>
        /// Undefined
        /// </summary>
        Undefined1 = 0x07,
        /// <summary>
        /// BACKSPACE key
        /// </summary>
        BACKSPACE_key = 0x08,
        /// <summary>
        /// TAB key
        /// </summary>
        TAB_key = 0x09,
        /// <summary>
        /// CLEAR key
        /// </summary>
        CLEAR_key = 0x0C,
        /// <summary>
        /// ENTER key
        /// </summary>
        ENTER_key = 0x0D,
        /// <summary>
        /// SHIFT key
        /// </summary>
        SHIFT_key = 0x10,
        /// <summary>
        /// CTRL key
        /// </summary>
        CTRL_key = 0x11,
        /// <summary>
        /// ALT key
        /// </summary>
        ALT_key = 0x12,
        /// <summary>
        /// PAUSE key
        /// </summary>
        PAUSE_key = 0x13,
        /// <summary>
        /// CAPS LOCK key
        /// </summary>
        CAPS_LOCK_key = 0x14,
        /// <summary>
        /// IME Kana mode
        /// </summary>
        IME_Kana_mode = 0x15,
        /// <summary>
        /// IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
        /// </summary>
        IME_Hanguel_mode = 0x15,
        /// <summary>
        /// IME Hangul mode
        /// </summary>
        IME_Hangul_mode = 0x15,
        /// <summary>
        /// Undefined
        /// </summary>
        Undefined2 = 0x16,
        /// <summary>
        /// IME Junja mode
        /// </summary>
        IME_Junja_mode = 0x17,
        /// <summary>
        /// IME final mode
        /// </summary>
        IME_final_mode = 0x18,
        /// <summary>
        /// IME Hanja mode
        /// </summary>
        IME_Hanja_mode = 0x19,
        /// <summary>
        /// IME Kanji mode
        /// </summary>
        IME_Kanji_mode = 0x19,
        /// <summary>
        /// Undefined
        /// </summary>
        Undefined = 0x1A,
        /// <summary>
        /// ESC key
        /// </summary>
        ESC_key = 0x1B,
        /// <summary>
        /// IME convert
        /// </summary>
        IME_convert = 0x1C,
        /// <summary>
        /// IME nonconvert
        /// </summary>
        IME_nonconvert = 0x1D,
        /// <summary>
        /// IME accept
        /// </summary>
        IME_accept = 0x1E,
        /// <summary>
        /// IME mode change request
        /// </summary>
        IME_mode_change_request = 0x1F,
        /// <summary>
        /// SPACEBAR
        /// </summary>
        SPACEBAR = 0x20,
        /// <summary>
        /// PAGE UP key
        /// </summary>
        PAGE_UP_key = 0x21,
        /// <summary>
        /// PAGE DOWN key
        /// </summary>
        PAGE_DOWN_key = 0x22,
        /// <summary>
        /// END key
        /// </summary>
        END_key = 0x23,
        /// <summary>
        /// HOME key
        /// </summary>
        HOME_key = 0x24,
        /// <summary>
        /// LEFT ARROW key
        /// </summary>
        LEFT_ARROW_key = 0x25,
        /// <summary>
        /// UP ARROW key
        /// </summary>
        UP_ARROW_key = 0x26,
        /// <summary>
        /// RIGHT ARROW key
        /// </summary>
        RIGHT_ARROW_key = 0x27,
        /// <summary>
        /// DOWN ARROW key
        /// </summary>
        DOWN_ARROW_key = 0x28,
        /// <summary>
        /// SELECT key
        /// </summary>
        SELECT_key = 0x29,
        /// <summary>
        /// PRINT key
        /// </summary>
        PRINT_key = 0x2A,
        /// <summary>
        /// EXECUTE key
        /// </summary>
        EXECUTE_key = 0x2B,
        /// <summary>
        /// PRINT SCREEN key
        /// </summary>
        PRINT_SCREEN_key = 0x2C,
        /// <summary>
        /// INS key
        /// </summary>
        INS_key = 0x2D,
        /// <summary>
        /// DEL key
        /// </summary>
        DEL_key = 0x2E,
        /// <summary>
        /// HELP key
        /// </summary>
        HELP_key = 0x2F,
        /// <summary>
        /// 0 key
        /// </summary>
        _0_key = 0x30,
        /// <summary>
        /// 1 key
        /// </summary>
        _1_key = 0x31,
        /// <summary>
        /// 2 key
        /// </summary>
        _2_key = 0x32,
        /// <summary>
        /// 3 key
        /// </summary>
        _3_key = 0x33,
        /// <summary>
        /// 4 key
        /// </summary>
        _4_key = 0x34,
        /// <summary>
        /// 5 key
        /// </summary>
        _5_key = 0x35,
        /// <summary>
        /// 6 key
        /// </summary>
        _6_key = 0x36,
        /// <summary>
        /// 7 key
        /// </summary>
        _7_key = 0x37,
        /// <summary>
        /// 8 key
        /// </summary>
        _8_key = 0x38,
        /// <summary>
        /// 9 key
        /// </summary>
        _9_key = 0x39,
        /// <summary>
        /// A key
        /// </summary>
        A_key = 0x41,
        /// <summary>
        /// B key
        /// </summary>
        B_key = 0x42,
        /// <summary>
        /// C key
        /// </summary>
        C_key = 0x43,
        /// <summary>
        /// D key
        /// </summary>
        D_key = 0x44,
        /// <summary>
        /// E key
        /// </summary>
        E_key = 0x45,
        /// <summary>
        /// F key
        /// </summary>
        F_key = 0x46,
        /// <summary>
        /// G key
        /// </summary>
        G_key = 0x47,
        /// <summary>
        /// H key
        /// </summary>
        H_key = 0x48,
        /// <summary>
        /// I key
        /// </summary>
        I_key = 0x49,
        /// <summary>
        /// J key
        /// </summary>
        J_key = 0x4A,
        /// <summary>
        /// K key
        /// </summary>
        K_key = 0x4B,
        /// <summary>
        /// L key
        /// </summary>
        L_key = 0x4C,
        /// <summary>
        /// M key
        /// </summary>
        M_key = 0x4D,
        /// <summary>
        /// N key
        /// </summary>
        N_key = 0x4E,
        /// <summary>
        /// O key
        /// </summary>
        O_key = 0x4F,
        /// <summary>
        /// P key
        /// </summary>
        P_key = 0x50,
        /// <summary>
        /// Q key
        /// </summary>
        Q_key = 0x51,
        /// <summary>
        /// R key
        /// </summary>
        R_key = 0x52,
        /// <summary>
        /// S key
        /// </summary>
        S_key = 0x53,
        /// <summary>
        /// T key
        /// </summary>
        T_key = 0x54,
        /// <summary>
        /// U key
        /// </summary>
        U_key = 0x55,
        /// <summary>
        /// V key
        /// </summary>
        V_key = 0x56,
        /// <summary>
        /// W key
        /// </summary>
        W_key = 0x57,
        /// <summary>
        /// X key
        /// </summary>
        X_key = 0x58,
        /// <summary>
        /// Y key
        /// </summary>
        Y_key = 0x59,
        /// <summary>
        /// Z key
        /// </summary>
        Z_key = 0x5A,
        /// <summary>
        /// Left Windows key (Natural keyboard)
        /// </summary>
        Left_Windows_key = 0x5B,
        /// <summary>
        /// Right Windows key (Natural keyboard)
        /// </summary>
        Right_Windows_key = 0x5C,
        /// <summary>
        /// Applications key (Natural keyboard)
        /// </summary>
        Applications_key = 0x5D,
        /// <summary>
        /// Reserved
        /// </summary>
        Reserved1 = 0x5E,
        /// <summary>
        /// Computer Sleep key
        /// </summary>
        Computer_Sleep_key = 0x5F,
        /// <summary>
        /// Numeric keypad 0 key
        /// </summary>
        Numeric_keypad_0_key = 0x60,
        /// <summary>
        /// Numeric keypad 1 key
        /// </summary>
        Numeric_keypad_1_key = 0x61,
        /// <summary>
        /// Numeric keypad 2 key
        /// </summary>
        Numeric_keypad_2_key = 0x62,
        /// <summary>
        /// Numeric keypad 3 key
        /// </summary>
        Numeric_keypad_3_key = 0x63,
        /// <summary>
        /// Numeric keypad 4 key
        /// </summary>
        Numeric_keypad_4_key = 0x64,
        /// <summary>
        /// Numeric keypad 5 key
        /// </summary>
        Numeric_keypad_5_key = 0x65,
        /// <summary>
        /// Numeric keypad 6 key
        /// </summary>
        Numeric_keypad_6_key = 0x66,
        /// <summary>
        /// Numeric keypad 7 key
        /// </summary>
        Numeric_keypad_7_key = 0x67,
        /// <summary>
        /// Numeric keypad 8 key
        /// </summary>
        Numeric_keypad_8_key = 0x68,
        /// <summary>
        /// Numeric keypad 9 key
        /// </summary>
        Numeric_keypad_9_key = 0x69,
        /// <summary>
        /// Multiply key
        /// </summary>
        Multiply_key = 0x6A,
        /// <summary>
        /// Add key
        /// </summary>
        Add_key = 0x6B,
        /// <summary>
        /// Separator key
        /// </summary>
        Separator_key = 0x6C,
        /// <summary>
        /// Subtract key
        /// </summary>
        Subtract_key = 0x6D,
        /// <summary>
        /// Decimal key
        /// </summary>
        Decimal_key = 0x6E,
        /// <summary>
        /// Divide key
        /// </summary>
        Divide_key = 0x6F,
        /// <summary>
        /// F1 key
        /// </summary>
        F1_key = 0x70,
        /// <summary>
        /// F2 key
        /// </summary>
        F2_key = 0x71,
        /// <summary>
        /// F3 key
        /// </summary>
        F3_key = 0x72,
        /// <summary>
        /// F4 key
        /// </summary>
        F4_key = 0x73,
        /// <summary>
        /// F5 key
        /// </summary>
        F5_key = 0x74,
        /// <summary>
        /// F6 key
        /// </summary>
        F6_key = 0x75,
        /// <summary>
        /// F7 key
        /// </summary>
        F7_key = 0x76,
        /// <summary>
        /// F8 key
        /// </summary>
        F8_key = 0x77,
        /// <summary>
        /// F9 key
        /// </summary>
        F9_key = 0x78,
        /// <summary>
        /// F10 key
        /// </summary>
        F10_key = 0x79,
        /// <summary>
        /// F11 key
        /// </summary>
        F11_key = 0x7A,
        /// <summary>
        /// F12 key
        /// </summary>
        F12_key = 0x7B,
        /// <summary>
        /// F13 key
        /// </summary>
        F13_key = 0x7C,
        /// <summary>
        /// F14 key
        /// </summary>
        F14_key = 0x7D,
        /// <summary>
        /// F15 key
        /// </summary>
        F15_key = 0x7E,
        /// <summary>
        /// F16 key
        /// </summary>
        F16_key = 0x7F,
        /// <summary>
        /// F17 key
        /// </summary>
        F17_key = 0x80,
        /// <summary>
        /// F18 key
        /// </summary>
        F18_key = 0x81,
        /// <summary>
        /// F19 key
        /// </summary>
        F19_key = 0x82,
        /// <summary>
        /// F20 key
        /// </summary>
        F20_key = 0x83,
        /// <summary>
        /// F21 key
        /// </summary>
        F21_key = 0x84,
        /// <summary>
        /// F22 key
        /// </summary>
        F22_key = 0x85,
        /// <summary>
        /// F23 key
        /// </summary>
        F23_key = 0x86,
        /// <summary>
        /// F24 key
        /// </summary>
        F24_key = 0x87,
        /// <summary>
        /// NUM LOCK key
        /// </summary>
        NUM_LOCK_key = 0x90,
        /// <summary>
        /// SCROLL LOCK key
        /// </summary>
        SCROLL_LOCK_key = 0x91,
        /// <summary>
        /// Left SHIFT key
        /// </summary>
        Left_SHIFT_key = 0xA0,
        /// <summary>
        /// Right SHIFT key
        /// </summary>
        Right_SHIFT_key = 0xA1,
        /// <summary>
        /// Left CONTROL key
        /// </summary>
        Left_CONTROL_key = 0xA2,
        /// <summary>
        /// Right CONTROL key
        /// </summary>
        Right_CONTROL_key = 0xA3,
        /// <summary>
        /// Left MENU key
        /// </summary>
        Left_MENU_key = 0xA4,
        /// <summary>
        /// Right MENU key
        /// </summary>
        Right_MENU_key = 0xA5,
        /// <summary>
        /// Browser Back key
        /// </summary>
        Browser_Back_key = 0xA6,
        /// <summary>
        /// Browser Forward key
        /// </summary>
        Browser_Forward_key = 0xA7,
        /// <summary>
        /// Browser Refresh key
        /// </summary>
        Browser_Refresh_key = 0xA8,
        /// <summary>
        /// Browser Stop key
        /// </summary>
        Browser_Stop_key = 0xA9,
        /// <summary>
        /// Browser Search key
        /// </summary>
        Browser_Search_key = 0xAA,
        /// <summary>
        /// Browser Favorites key
        /// </summary>
        Browser_Favorites_key = 0xAB,
        /// <summary>
        /// Browser Start and Home key
        /// </summary>
        Browser_Start_and_Home_key = 0xAC,
        /// <summary>
        /// Volume Mute key
        /// </summary>
        Volume_Mute_key = 0xAD,
        /// <summary>
        /// Volume Down key
        /// </summary>
        Volume_Down_key = 0xAE,
        /// <summary>
        /// Volume Up key
        /// </summary>
        Volume_Up_key = 0xAF,
        /// <summary>
        /// Next Track key
        /// </summary>
        Next_Track_key = 0xB0,
        /// <summary>
        /// Previous Track key
        /// </summary>
        Previous_Track_key = 0xB1,
        /// <summary>
        /// Stop Media key
        /// </summary>
        Stop_Media_key = 0xB2,
        /// <summary>
        /// Play/Pause Media key
        /// </summary>
        Play_Or_Pause_Media_key = 0xB3,
        /// <summary>
        /// Start Mail key
        /// </summary>
        Start_Mail_key = 0xB4,
        /// <summary>
        /// Select Media key
        /// </summary>
        Select_Media_key = 0xB5,
        /// <summary>
        /// Start Application 1 key
        /// </summary>
        Start_Application_1_key = 0xB6,
        /// <summary>
        /// Start Application 2 key
        /// </summary>
        Start_Application_2_key = 0xB7,
        /// <summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        /// </summary>
        Used_for_miscellaneous_characters1 = 0xBA,
        /// <summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        /// </summary>
        Used_for_miscellaneous_characters2 = 0xBF,
        /// <summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        /// </summary>
        Used_for_miscellaneous_characters3 = 0xC0,
        /// <summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        /// </summary>
        Used_for_miscellaneous_characters4 = 0xDB,
        /// <summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        /// </summary>
        Used_for_miscellaneous_characters5 = 0xDC,
        /// <summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        /// </summary>
        Used_for_miscellaneous_characters6 = 0xDD,
        /// <summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        /// </summary>
        Used_for_miscellaneous_characters7 = 0xDE,
        /// <summary>
        /// Used for miscellaneous characters; it can vary by keyboard.
        /// </summary>
        Used_for_miscellaneous_characters8 = 0xDF,
        /// <summary>
        /// Reserved
        /// </summary>
        Reserved2 = 0xE0,
        /// <summary>
        /// OEM specific
        /// </summary>
        OEM_specific1 = 0xE1,
        /// <summary>
        /// Either the angle bracket key or the backslash key on the RT 102-key keyboard
        /// </summary>
        Either_the_angle_bracket_key_or_the_backslash_key_on_the_RT_102_key_keyboard = 0xE2,
        /// <summary>
        /// IME PROCESS key
        /// </summary>
        IME_PROCESS_key = 0xE5,
        /// <summary>
        /// OEM specific
        /// </summary>
        OEM_specific2 = 0xE6,
        /// <summary>
        /// Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP
        /// </summary>
        Used_to_pass_Unicode_characters_as_if_they_were_keystrokes = 0xE7,
        /// <summary>
        /// Unassigned
        /// </summary>
        Unassigned = 0xE8,
        /// <summary>
        /// Attn key
        /// </summary>
        Attn_key = 0xF6,
        /// <summary>
        /// CrSel key
        /// </summary>
        CrSel_key = 0xF7,
        /// <summary>
        /// ExSel key
        /// </summary>
        ExSel_key = 0xF8,
        /// <summary>
        /// Erase EOF key
        /// </summary>
        Erase_EOF_key = 0xF9,
        /// <summary>
        /// Play key
        /// </summary>
        Play_key = 0xFA,
        /// <summary>
        /// Zoom key
        /// </summary>
        Zoom_key = 0xFB,
        /// <summary>
        /// Reserved
        /// </summary>
        Reserved = 0xFC,
        /// <summary>
        /// PA1 key
        /// </summary>
        PA1_key = 0xFD,
        /// <summary>
        /// Clear key
        /// </summary>
        Clear_key = 0xFE
    }

调用演示:



//模拟实现Ctrl+O操作
模拟按下按键(VirtualKeyCode.CTRL_key)
模拟单击按键(VirtualKeyCode.O_key)
模拟弹起按键(VirtualKeyCode.CTRL_key)

[转载]在WebBrowser中执行javascript脚本的几种方法整理(execScript/InvokeScript/NavigateScript) 附完整源码 - 郑文亮 - 博客园

mikel阅读(2288)

[转载]在WebBrowser中执行javascript脚本的几种方法整理(execScript/InvokeScript/NavigateScript) 附完整源码 – 郑文亮 – 博客园.

【实例简介】

涵盖了几种常用的 webBrowser执行JavaScript的方法,详见示例截图以及代码
【实例截图】

 

 

 


【核心代码】
execScript方式:


using mshtml;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WebBrowser_Script
{
public partial class execScriptForm : Form
{
public execScriptForm()
{
InitializeComponent();
}

private void btnOpen_Click(object sender, EventArgs e)
{
this.webBrowser1.Navigate(this.txtUrl.Text);
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
IHTMLDocument2 Doc2 = (IHTMLDocument2)webBrowser1.Document.DomDocument;

if (Doc2.parentWindow != null)
{
string order = " alert('这里可以执行页面中存在的任意函数' document.body.innerHTML); ";
//MessageBox.Show(order);
Doc2.parentWindow.execScript(order, "JavaScript");
}
}
}
}

NavigateScript方式:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace WebBrowser_Script
{
[ComVisible(true)]
public partial class NavigateScriptForm : Form
{
public NavigateScriptForm()
{
InitializeComponent();

}

private void btnOpen_Click(object sender, EventArgs e)
{
this.webBrowser1.Navigate(this.txtUrl.Text);

}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Navigate(@"javascript:
function alert(str)
{
window.external.alertMessage(str);
}");
webBrowser1.ObjectForScripting = this;
}
public void alertMessage(string s)
{
MessageBox.Show(s, "这是自定义的title,呵呵呵");
}

private void NavigateScriptForm_Load(object sender, EventArgs e)
{
webBrowser1.DocumentText = @"

";
}
}
}

InvokeScript方式:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WebBrowser_Script
{
public partial class InvokeScriptForm : Form
{
public InvokeScriptForm()
{
InitializeComponent();
this.webBrowser1.Navigate(this.txtUrl.Text);
}

private void btnOpen_Click(object sender, EventArgs e)
{
var input = this.webBrowser1.Document.GetElementById("kw");
input.SetAttribute("value", "好例子网");
var button = this.webBrowser1.Document.GetElementById("su");
button.InvokeMember("click");
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

}
}
}

 

另外:InvokeScript 还可以带参数的形式执自定义行脚本方法

例如: webBrowser1.Document.InvokeScript(getPwd, new object[] { 18780110000 })

实例下载地址

在WebBrowser中执行JavaScript脚本的几种方法整理(execScript/InvokeScript/NavigateScript) 附完整源码

[转载]我的INI 配置文件读写动态库 - 钢钢 - 博客园

mikel阅读(1134)

[转载]我的INI 配置文件读写动态库 – 钢钢 – 博客园.

工作需要,今天上午花时间看了一下INI 配置文件的相关文章,并添加到项目中。

后来想想,干脆封装成DLL 动态库,并提供给大家使用,顺便更新一下博客。^_^

 

INI 配置文件的格式

在早期的Windows 桌面系统中,主要是用INI 文件作为系统的配置文件,从Win95 以后开始转向使用注册表,但是还有很多系统配置是使用INI 文件的。其实,INI 文件就是简单的text 文件,只不过这种txt 文件要遵循一定的INI 文件格式。

“.ini” 就是英文 “initialization” 的头三个字母的缩写;当然INI file 的后缀名也不一定是”.ini”也可以是”.cfg”,”.conf ”或者是”.txt”。

经典格式:

INI文件的格式很简单,最基本的三个要素是:parameters,sections 和 comments。

什么是 parameters?

INI所包含的最基本的“元素”就是parameter;每一个parameter都有一个name和一个value,name和value是由等号“=”隔开。name在等号的左边。

如:  name = value

什么是sections ?

所有的parameters都是以sections为单位结合在一起的。所有的section名称都是独占一行,并且sections名字都被方括 号包围着 ([ and ])。在section声明后的所有parameters都是属于该section。对于一个section没有明显的结束标志符,一个section的 开始就是上一个section的结束,或者是end of the file。Sections一般情况下不能被nested,当然特殊情况下也可以实现sections的嵌套。

section 如:   [section]

 什么是 comments ?

在INI 文件中注释语句是以分号“;”开始的。所有的注释语句不管多长都是独占一行直到结束的。在分号和行结束符之间的所有内容都是被忽略的。

注释如:   ;comments text

 

当然,上面讲的都是最经典的INI文件格式,随着使用的需求INI文件的格式也出现了很多变种;

变种格式:请参考:http://en.wikipedia.org/wiki/INI_file

 

我的 INI 配置文件读写动态库

其实就是调用了kernel32.dll 中的 WritePrivateProfileString 和 GetPrivateProfileString 函数。

kernel32.dll是Windows 9x/Me 中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理。

INI 配置文件读写动态库 INIHelper.dll 的源码很简单,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;

namespace INIHelper
{
public class INIFileHelper
{
private string strFileName = ""; //INI文件名
private string strFilePath = "";//获取INI文件路径

public INIFileHelper()
{
strFileName = "Config.ini"; //INI文件名
//方法1:获取INI文件路径
strFilePath = Directory.GetCurrentDirectory() + "\\" + strFileName;
//方法2:获取INI文件路径
//strFilePath = Path.GetFullPath(".\\") + strFileName;
}

public INIFileHelper(string FileName)
{
strFileName = FileName; //INI文件名
//获取INI文件路径
strFilePath = Directory.GetCurrentDirectory() + "\\" + strFileName;
}

public INIFileHelper(string FullPath, string FileName)
{
strFileName = FileName; //INI文件名
strFilePath = FullPath + "\\" + strFileName;//获取INI文件路径
}

///
/// 写入INI文件
///

///节点名称[如[TypeName]] ///键 ///值 ///文件路径 ///
[DllImport("kernel32")]
public static extern long WritePrivateProfileString(string section, string key, string val, string filepath);

///
/// 写入
///

///section 节点名称 ///key 值 ///value 值 public void Write(string sectionName, string key, string value)
{
try
{
//根据INI文件名设置要写入INI文件的节点名称
//此处的节点名称完全可以根据实际需要进行配置
strFileName = Path.GetFileNameWithoutExtension(strFilePath);
INIFileHelper.WritePrivateProfileString(sectionName, key, value, strFilePath);
}
catch
{
throw new Exception("配置文件不存在或权限不足导致无法写入");
}
}

///
/// 写入默认节点"FileConfig"下的相关数据
///

///key 值 ///value 值 public void Write(string key, string value)
{
// section 节点名称使用默认值:"FileConfig"
Write("FileConfig", key, value);
}

///
/// 读取INI文件
///

///节点名称 ///键 ///值 ///stringbulider对象 ///字节大小 ///文件路径 ///
[DllImport("kernel32")]
public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retval, int size, string filePath);

///
/// 读取
///

///section 节点名称 ///key 值 /// value 值
public string Read(string sectionName, string key)
{
if (File.Exists(strFilePath)) //读取时先要判读INI文件是否存在
{
strFileName = Path.GetFileNameWithoutExtension(strFilePath);
//return ContentValue(strFileName, key);
StringBuilder outValue = new StringBuilder(1024);
INIFileHelper.GetPrivateProfileString(sectionName, key, "", outValue, 1024, strFilePath);
return outValue.ToString();
}
else
{
throw new Exception("配置文件不存在");
}
}

///
/// 读取默认节点"FileConfig"下的相关数据
///

///key 值 /// value 值
public string Read(string key)
{
// section 节点名称使用默认值:"FileConfig"
return Read("FileConfig", key);
}

}
}

对 INIHelper.dll 动态库的使用和测试,代码如下:

// 获取INI文件路径
// private string strFilePath = Application.StartupPath + "\\FileConfig.ini";

//写入
private void button1_Click(object sender, EventArgs e)
{
//test1(WinForm 测试)
string strFilePath = "Config.ini";//获取INI文件路径
INIFileHelper file1 = new INIFileHelper(strFilePath);
file1.Write(label1.Text, textBox1.Text);
file1.Write(label2.Text, textBox2.Text);
MessageBox.Show("test1 写入完毕");

//test2
INIFileHelper file2 = new INIFileHelper();
file2.Write("xugang", "http://xugang.cnblogs.com");
file2.Write("hobby", "@#$%^&amp;*()");
MessageBox.Show("test2 写入完毕");

//test3
INIFileHelper file3 = new INIFileHelper("newConfig.ini");
file3.Write("NewSection", "xugang", "http://xugang.cnblogs.com");
file3.Write("NewSection", "hobby", "@#$%^&amp;*()");
MessageBox.Show("test3 写入完毕");

//test4
string strPath = Application.StartupPath; //文件路径
string strName = "xxx.ini";//INI文件名称

INIFileHelper file4 = new INIFileHelper(strPath, strName);
file4.Write("NewSection", "xugang", "http://xugang.cnblogs.com");
file4.Write("NewSection", "hobby", "@#$%^&amp;*()");
MessageBox.Show("test4 写入完毕");
}

//读取
private void button2_Click(object sender, EventArgs e)
{
//test1(WinForm 测试)
string strFilePath = "Config.ini";//获取INI文件路径
INIFileHelper file1 = new INIFileHelper(strFilePath);
StringBuilder str = new StringBuilder();
str.AppendLine(file1.Read(label1.Text));
str.AppendLine(file1.Read(label2.Text));
MessageBox.Show(str.ToString());

//test2
INIFileHelper file2 = new INIFileHelper();
MessageBox.Show(file2.Read("xugang") +" "+file2.Read("hobby"));

//test3
INIFileHelper file3 = new INIFileHelper("newConfig.ini");
MessageBox.Show( file3.Read("NewSection", "xugang")
+ " " + file3.Read("NewSection", "hobby"));

//test4
string strPath = Application.StartupPath; //文件路径
string strName = "xxx.ini";//INI文件名称

INIFileHelper file4 = new INIFileHelper(strPath, strName);
MessageBox.Show(file4.Read("NewSection", "xugang")
+ " " + file4.Read("NewSection", "hobby"));
}

参考来源:

INI 配置文件的格式

INI 格式文件操作

源码下载

作者: XuGang   网名:钢钢
出处: http://xugang.cnblogs.com
声明: 本文版权归作者和博客园共有。转载时必须保留此段声明,且在文章页面明显位置给出原文连接地址!

[转载]WinForm 快捷键设置 - 双魂人生 - 博客园

mikel阅读(1169)

[转载]WinForm 快捷键设置 – 双魂人生 – 博客园.

1、Alt+*(按钮快捷键)
按钮快捷键也为最常用快捷键,其设置也故为简单。在大家给button、label、menuStrip等其他控件的Text属性指定名称时,在其后面加上‘&’然后在加上一个指定字母即可。如:确定(&D),(Alt+D)调用。

如指定多个字母,则第一个为快捷键。如:确定(&OK),(Alt+O)调用;文件(&Fill),(Alt+F)调用。

2、Ctrl+*及其他组合键
把 Form 的 KeyPreview 属性设为 True
使用Modifiers可设置组合键,键盘数字区按键的Keys枚举以D打头,而小键盘上的数字以NumPad打头。按下Ctrl与 Shift组合键的方法与其类似,将Ctrl和Alt的枚举转换为int型相加后与Modifiers对比,这样即可判断是否按下了该组合键。

 

private void   frmMain_KeyDown(object sender, KeyEventArgs e)
{

//比如你的窗体名是frmMain,确定按钮btnOK,保存按钮btnSave

//单键
switch (e.KeyCode)
{
case Keys.F1:
btnOK_Click(this, EventArgs.Empty);
break;

case Keys.F2:
btnSave_Click(this, EventArgs.Empty);
break;
}

// 组合键

if (e.KeyCode == Keys.F1 && e.Modifiers == Keys.Control)         //Ctrl+F1
{
btnShouYi_Click(this, EventArgs.Empty);
}

if ((int)e.Modifiers == ((int)Keys.Control + (int)Keys.Alt) && e.KeyCode == Keys.D0)   //Ctrl + Alt + 数字0

{

MessageBox.Show(“按下了Control + Alt + 0”);

}
另外的,与窗体的AcceptButton属性相关联的按钮,将与键盘上的Enter键对应;与窗体的CancelButton属性相关联的按钮,将与键盘上的Ecs键对应。

this.AcceptButton = btnOKLogin;
this.CancelButton = btnEscLogin;
}

 

#实现快捷键(系统热键)响应
在应用中,我们可能会需要实现像Ctrl+C复制、Ctrl+V粘贴这样的快捷键,本文简单介绍了它的实现,并给出了一个实现类。

(1)建立一个类文件,命名为HotKey.cs,代码如下:
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace KoalaStudio.BookshopManager
{
class HotKey
{
//如果函数执行成功,返回值不为0。
//如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
[DllImport(“user32.dll”, SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd,                //要定义热键的窗口的句柄
int id,                     //定义热键ID(不能与其它ID重复)
KeyModifiers fsModifiers,   //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
Keys vk                     //定义热键的内容
);

[DllImport(“user32.dll”, SetLastError = true)]
public static extern bool UnregisterHotKey(
IntPtr hWnd,                //要取消热键的窗口的句柄
int id                      //要取消热键的ID
);

//定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
[Flags()]
public enum KeyModifiers
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
WindowsKey = 8
}
}
}

简单说明一下:
“public static extern bool RegisterHotKey()”这个函数用于注册热键。由于这个函数需要引用user32.dll动态链接库后才能使用,并且

user32.dll是非托管代码,不能用命名空间的方式直接引用,所以需要用“DllImport”进行引入后才能使用。于是在函数前面需要加上

“[DllImport(“user32.dll”, SetLastError = true)]”这行语句。
“public static extern bool UnregisterHotKey()”这个函数用于注销热键,同理也需要用DllImport引用user32.dll后才能使用。
“public enum KeyModifiers{}”定义了一组枚举,将辅助键的数字代码直接表示为文字,以方便使用。这样在调用时我们不必记住每一个辅

助键的代码而只需直接选择其名称即可。

(2)以窗体FormA为例,介绍HotKey类的使用

在FormA的Activate事件中注册热键,本例中注册Shift+S,Ctrl+Z,Alt+D这三个热键。这里的Id号可任意设置,但要保证不被重复。
private void Form_Activated(object sender, EventArgs e)
{
//注册热键Shift+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。
HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S);
//注册热键Ctrl+B,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。
HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B);
//注册热键Alt+D,Id号为102。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。
HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt, Keys.D);
}

在FormA的Leave事件中注销热键。
private void FrmSale_Leave(object sender, EventArgs e)
{
//注销Id号为100的热键设定
HotKey.UnregisterHotKey(Handle, 100);
//注销Id号为101的热键设定
HotKey.UnregisterHotKey(Handle, 101);
//注销Id号为102的热键设定
HotKey.UnregisterHotKey(Handle, 102);
}

重载FromA中的WndProc函数
///
/// 监视Windows消息
/// 重载WndProc方法,用于实现热键响应
///
///
protected override void WndProc(ref Message m)
{
const int WM_HOTKEY = 0x0312;
//按快捷键
switch (m.Msg)
{
case WM_HOTKEY:
switch (m.WParam.ToInt32())
{
case 100:    //按下的是Shift+S
//此处填写快捷键响应代码
break;
case 101:    //按下的是Ctrl+B
//此处填写快捷键响应代码
break;
case 102:    //按下的是Alt+D
//此处填写快捷键响应代码
break;
}
break;
}
base.WndProc(ref m);
}
完成代码后,我们在窗体中按下Shift+S、Ctrl+B、Alt+D这三组快捷键中的任意一组时,程序都会做出响应的反应。

 

[转载]WinForm中快捷键与组合按键的设置 - Ju2ender - 博客园

mikel阅读(1159)

[转载]WinForm中快捷键与组合按键的设置 – Ju2ender – 博客园.

快捷键在WinForm软件中必不可少,可以提高使用者的效率,下面就来看看怎样在我们 的窗体中加上快捷键,新建一个Windows应用程序(我将解决方案命名为Keybd_Test,项目名为UI)。删掉自动生成的Form1.cs窗体, 新建MainForm.cs窗体。调整大小,将StartPosition设置为CenterScreen,让窗体一运行就可以居中;将ShowIcon 设置为false,去掉窗体标题栏的图标,现在什么控件也不加:

每个窗体都有这样3个事件:KeyDown、KeyPress、KeyUp,KeyDown和KeyPress都是按键按下事件,但KeyDown 用的是KeyCode跟键盘各个按键相对应,它对应Keys枚举,用起来比较方便;而KeyPress用的是KeyChar,这个就要找ASC II编码了,不方便。KeyUp是按键弹起事件,不常用,因此我们使用KeyDown事件来设置窗体的快捷键,双击该事件后的空白生成代码,首先我们设置 单个按键,让它按下F11最大化,再次按下还原,在事件中加入如下代码:

if (e.KeyCode == Keys.F11)
{
    if (WindowState == FormWindowState.Maximized)
        WindowState = FormWindowState.Normal;
    else
        WindowState = FormWindowState.Maximized;
}

若窗体的WindowState为Maximized则还原,否则最大化,运行下试试,很好用 🙂

下面在窗体中加入一个名为txtInput的TextBox,两个名为btnConfirm、btnExit的Button:

再次运行窗体,按下F11,不起作用了?这是怎么回事?

因为这时窗体运行后,焦点已不在窗体上,而在控件上了,我们要将窗体的KeyPreview设置为True,向窗体注册控件上产生的键盘事件,再次运行,问题解决了。

那么组合按键又怎么设置呢?例如要按下Alt和数字0,需要这样:

if (e.Modifiers == Keys.Alt && e.KeyCode == Keys.D0)
{
    MessageBox.Show("按下了Alt + 0");
}

使用Modifiers可设置组合键,键盘数字区按键的Keys枚举以D打头,而小键盘上的数字以NumPad打头。按下Ctrl与Shift组合键的方法与其类似,下面我们看看按下Ctrl + Alt + 数字0该怎样设置:

if ((int)e.Modifiers == ((int)Keys.Control + (int)Keys.Alt) && e.KeyCode == Keys.D0)
{
    MessageBox.Show("按下了Control + Alt + 0");
}

将Ctrl和Alt的枚举转换为int型相加后与Modifiers对比,这样即可判断是否按下了该组合键。

另外的,与窗体的AcceptButton属性相关联的按钮,将与键盘上的Enter键对应;与窗体的CancelButton属性相关联的按钮,将与键盘上的Ecs键对应。

在设置Button的Text属性时,在一个英文字母的前面加上&(and符),例如将btnConfirm的Text属性设置为:&Confirm,当运行窗体,按下Alt + C时,就相当于按下该键。

示例下载:Keybd_Test(用VS 2005创建,.NET版本2.0)。

作者:Ju2ender
出处:http://ju2ender.cnblogs.com
本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。 版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

邮件发送营销基本完成

mikel阅读(805)

昨天写的那个《自动化营销推广》中提到的软件,今天基本上完成,尽管没有对接打码平台,自动打码,只是实现了自动读取邮件数据库,然后填表单,需要手动输入验证码,然后点击发送邮件

1.点击“填表”,自动读取邮箱数据库,填到表单里面的5个邮箱里面,然后手动输入验证码,然后点击发送邮件
QQ截图20150125155319

2.发送成功
QQ截图20150125155749

软件下载地址:http://pan.baidu.com/s/1o6Ls6zo

[转载]城通网盘文件地址分析器 - duguao - 博客园

mikel阅读(941)

[转载]城通网盘文件地址分析器 – duguao – 博客园.

问题背景:闲来无事网上乱逛。一不小心就逛到了VC驿站,手贱啊!还是禁不住点了进去!虽然现在学习C#不想去看C++了,还是手贱点了进去。作为资源控的我,看到了一篇资源贴:
=========================================================================================================
棉猴老师套接字编程【全部免key】 尽快下载,晚了就关共享了
http://www.t00y.com/file/11381890 ;    第5-4次课 基于WSAEventSelect模型的五子棋程序2.rar
http://www.t00y.com/file/11381892 ;    第5-5次课 基于WSAEventSelect模型的五子棋程序3.rar
http://www.t00y.com/file/11381893 ;    第5-6次课 基于WSAEventSelect模型的五子棋程序4.rar
http://www.t00y.com/file/11381895 ;    第6-1次课 套接字重叠IO模型基础1.rar
http://www.t00y.com/file/11381898 ;    第6-2次课 套接字重叠IO模型基础2.rar
http://www.t00y.com/file/11381972 ;    第6-3次课 套接字重叠IO模型基础3.rar
http://www.t00y.com/file/11382000 ;    第6-4次课 网络词典代码分析1.rar
http://www.t00y.com/file/11382002 ;    第6-5次课 网络词典代码分析2.rar
http://www.t00y.com/file/11382053 ;    第6-6次课 网络词典代码分析3.rar
http://www.t00y.com/file/11382080 ;    第6-7次课 网络词典代码分析4.rar
http://www.t00y.com/file/11382083 ;    第7-1次课 完成端口模型基础1.rar
http://www.t00y.com/file/11382085 ;    第7-2次课 完成端口模型基础2.rar
http://www.t00y.com/file/11382086 ;    第7-3次课 基于完成端口模型学生考试系统1.rar
http://www.t00y.com/file/11382090 ;    第7-4次课 基于完成端口模型学生考试系统2.rar
http://www.t00y.com/file/11382093 ;    第7-5次课 基于完成端口模型学生考试系统3.rar
http://www.t00y.com/file/11381760 ;    第2-2次课 利用非阻塞套接字实现数据的发送和接收.rar
http://www.t00y.com/file/11381763 ;    第2-3次课 远程算数运算程序解析1.rar
http://www.t00y.com/file/11381765 ;    第2-4次课 远程算数运算程序解析2.rar
http://www.t00y.com/file/11381768 ;    第2-5次课 远程算数运算程序解析3.rar
http://www.t00y.com/file/11381770 ;    第3-1次课 Select模型开发.rar
http://www.t00y.com/file/11381772 ;    第3-2次课 简单select模型.rar
http://www.t00y.com/file/11381775 ;    第3-3次课 简单select模型2.rar
http://www.t00y.com/file/11381777 ;    第3-4次课 基于select模型的远程文件下载1.rar
http://www.t00y.com/file/11381842 ;    第3-5次课 基于select模型的远程文件下载2.rar
http://www.t00y.com/file/11381879 ;    第3-6次课 基于select模型的远程文件下载3.rar
http://www.t00y.com/file/11381880 ;    第4-1次课 WSAAsyncselect模型开发.rar
http://www.t00y.com/file/11381881 ;    第4-2次课 窗口例程对消息的处理.rar
http://www.t00y.com/file/11381882 ;    第4-3次课 WSAAsyncSelect模型小结.rar
http://www.t00y.com/file/11381886 ;    第5-2次课 WSAEventSelect模型基础2.rar
http://www.t00y.com/file/11381888 ;    第5-3次课 基于WSAEventSelect模型的五子棋程序1.rar
http://www.t00y.com/file/11381741 ;    select模型远程文件下载代码.rar
http://www.t00y.com/file/11381743 ;    第1-1次课 套接字基本函数1.rar
http://www.t00y.com/file/11381746 ;    第1-2次课 套接字基本函数2.rar
http://www.t00y.com/file/11381747 ;    第1-3次课 阻塞方式服务端编程1.rar
http://www.t00y.com/file/11381749 ;    第1-4次课 阻塞方式服务端编程2.rar
http://www.t00y.com/file/11381751 ;    第1-5次课 阻塞方式客户端编程1.rar
http://www.t00y.com/file/11381755 ;    第1-6次课 阻塞方式客户端编程2.rar
http://www.t00y.com/file/11381757 ;    第1-7次课 套接字阻塞方式大数据传输.rar
http://www.t00y.com/file/11381759 ;    第2-1次课 套接字非阻塞方式.rar
=========================================================================================================
 尼玛这是要逆天啊!这么XX多!Shit!Oh My God!点了一个进去,资源发布在一个叫城通网盘的网站上。

且不说难以忍受的广告。这种页面跳转的风格就让人不爽。我实在难以忍受,决定来次数据的较量!用程序实现自动分析文件资源地址的功能。先看看实现的效果吧:

只需要输入文件ID,例如:http://www.t00y.com/file/11381743就只需要输入11381743,输入正确的验证码。就能获取资源文件的迅雷下载地址了。如果在加个批量分析导入文件ID,批量导出下载地址的功能使用起来就会更加方便。
下面简单说一下程序实现的关键点:
1.验证码Session ID的处理。
验证码地址:http://www.ctdisk.com/guest_loginV2.php。每次对验证码请求时,服务端都会产生一个Session来记录正确的验证码。并且会返回一个Session ID储存在客户端的Cookie中。提交数据时会根据提交的Cookie中的Session ID去找到相应的Session进行验证码的比对。
使 用WebClient取得Cookie的方法。请求返回后利用string cookie=wc.ResponseHeaders.Get(“Set- Cookie”)从返回http头文件的Set-Cookie行取得Cookie的值。提交数据时只需使用 wc.Headers.Add(“Cookie:” + cookie);向请求头中添加请求验证码返回的Cookie就Ok了。
2.验证码显示在winform窗体上。
WebClient常用的请求资源的方法有DownLoadFile,DownLoadData,DownLoadString。
DownLoadFile,DownLoadData都能实现把验证码图片显示到winform中。在这里我选择用 DownLoadData获取验证码图片的byte[]数据流的方式。

WebClient wc = new WebClient();
            Uri url = new Uri("http://www.ctdisk.com/randcodeV2.php");
             //获取验证码图片byte[]数据流
            var codedata = wc.DownloadData(url);
            //通过byte[]数组创建内存流 
            MemoryStream ms = new MemoryStream(codedata);
          //通过内存流创建图片。并把图片显示到pictureBox上 
            pictureBox1.Image = Image.FromStream(ms);

下面是完整代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace DownLoader
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string cookie = null;
        private void btnGetCode_Click(object sender, EventArgs e)
        {
            WebClient wc = new WebClient();
            Uri url = new Uri("http://www.ctdisk.com/randcodeV2.php");
            //获取验证码图片byte[]数据
            var codedata = wc.DownloadData(url);
            //转换成内存流
            MemoryStream ms = new MemoryStream(codedata);
            //通过内存流创建图片并显示到PictureBox上
            pictureBox1.Image = Image.FromStream(ms);
            //从WebClient的ResponseHeaders中获取验证码Session ID的Cookie
            cookie = wc.ResponseHeaders.Get("Set-Cookie");
        }
 
        private void btnGetSource_Click(object sender, EventArgs e)
        {
            WebClient wc = new WebClient();
            wc.Encoding = Encoding.UTF8;
            Uri surl = new Uri("http://www.ctdisk.com/file/"+txtFileId.Text.Trim());
            string html = wc.DownloadString(surl);
            //先获取资源文件的hash_id,这个在验证时也会使用。hash_id与文件不对应,居然报的是验证码错误!呵呵!
            string hash_id = Regex.Match(html,@"<input type=""hidden"" id=""hash_id"" name=""hash_id"" value=""(.+)""/>").Groups[1].Value;
            Uri url = new Uri("http://www.ctdisk.com/guest_loginV2.php");
            //Post提交数据必须的头
            wc.Headers.Add("Content-Type: application/x-www-form-urlencoded");
            wc.Headers.Add("Cookie:" + cookie);
            //Post提交的数据
            string poststr =
                String.Format(
                "file_id={0}&hash_id={1}&randcode={2}&Comfirm.x=153&Comfirm.y=20",
                txtFileId.Text.Trim(),hash_id, txtCode.Text.Trim());
            //把Post提交数据转换成byte[]
            byte[] postdata = Encoding.UTF8.GetBytes(poststr);
            //Post提交数据并取得返回结果
            string strhtml = Encoding.UTF8.GetString(wc.UploadData(url, "POST", postdata));
            //对返回的数据进行处理
            if (strhtml.Contains("验证码输入错误"))
            {
                txtMsg.Text = "验证码错误或已失效!请从新输入!";
                this.btnGetCode_Click(sender,e);
            }
            else
            {
                //正则匹配出资源文件下载地址
                Match m = Regex.Match(strhtml, @"thunderHref=""(thunder://.+)""");
                if (m.Length!=0)
                {
                    txtMsg.Text = m.Groups[1].Value;
                }
                else
                {
                    txtMsg.Text = "获取资源地址出错!请稍后重试!\r\n"+strhtml;
                }
            }
        }
    }
}

[转载]vb.net获取web验证码在winform中显示的简单示例 - Konimeter - 博客园

mikel阅读(828)

[转载]vb.net获取web验证码在winform中显示的简单示例 – Konimeter – 博客园.

Private Sub GetImage()
        Try
            Dim request As HttpWebRequest = WebRequest.Create("http://www.junjv.com/GetImage")
            request.Timeout = 20000
            request.ServicePoint.ConnectionLimit = 100
            request.ReadWriteTimeout = 30000
            request.Method = "GET"
            Dim response As HttpWebResponse = request.GetResponse()
            If (response.StatusCode <> HttpStatusCode.OK) Then
                Exit Sub
            End If
            Dim resStream As Stream = response.GetResponseStream()
            PictureBox1.Image = New Bitmap(resStream) '这个是winform中的控件
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

 

自动化营销推广

mikel阅读(1216)

为什么说自动化营销推广,因为最近在做这方面的东西,其实也是偶然想到的一个方法,没啥新东西,就是发邮件推广,不过觉得还是有几个亮点的,一个是用了别人的资源,二是半自动化从邮件数据库中提取邮件,发送推广邮件。

软件还在做,过程中也学到了不少东西,等做出来给大家分享。

先说下思路,
1.推荐的项目是陆金所
2.进入推荐页面,点击邮件图标
QQ截图20150124171943
3.会弹出输入邮箱的表单,这里的邮箱数据是我的一个供求网站上很多企业的邮箱数据库中的数据,需要读取数据然后,自动填写到这里,然后输入验证码(这里可以做成挂接打码平台,进行自动打码,这样软件就是全自动了),然后自动点击发送邮件,就可以群发邮件了
QQ截图20150124172000

好了,思路就是这样,技术实现不难,难得是邮箱数据资源,看来只有工具,没有资源也是难做营销的,要做好日常积累。