C#通过代码的方式模拟键盘按下

本文转自:

https://www.cnblogs.com/xielong/p/6763121.html

如何模拟键盘按键触发产生的事件,比如模拟按下Alt + F4 关闭当前程序,Ctrl+Shift 切换输入法等。可以通过win32api 键盘事件 keybd_event() 来实现

1、定义键盘按键对应得键码

#region bVk参数 常量定义

        public const byte vbKeyLButton = 0x1;    // 鼠标左键
        public const byte vbKeyRButton = 0x2;    // 鼠标右键
        public const byte vbKeyCancel = 0x3;     // CANCEL 键
        public const byte vbKeyMButton = 0x4;    // 鼠标中键
        public const byte vbKeyBack = 0x8;       // BACKSPACE 键  空格键
        public const byte vbKeyTab = 0x9;        // TAB 键
        public const byte vbKeyClear = 0xC;      // CLEAR 键
        public const byte vbKeyReturn = 0xD;     // ENTER 键
        public const byte vbKeyShift = 0x10;     // SHIFT 键
        public const byte vbKeyControl = 0x11;   // CTRL 键
        public const byte vbKeyAlt = 18;         // Alt 键  (键码18)
        public const byte vbKeyMenu = 0x12;      // MENU 键
        public const byte vbKeyPause = 0x13;     // PAUSE 键
        public const byte vbKeyCapital = 0x14;   // CAPS LOCK 键
        public const byte vbKeyEscape = 0x1B;    // ESC 键
        public const byte vbKeySpace = 0x20;     // SPACEBAR 键
        public const byte vbKeyPageUp = 0x21;    // PAGE UP 键
        public const byte vbKeyEnd = 0x23;       // End 键
        public const byte vbKeyHome = 0x24;      // HOME 键
        public const byte vbKeyLeft = 0x25;      // LEFT ARROW 键
        public const byte vbKeyUp = 0x26;        // UP ARROW 键
        public const byte vbKeyRight = 0x27;     // RIGHT ARROW 键
        public const byte vbKeyDown = 0x28;      // DOWN ARROW 键
        public const byte vbKeySelect = 0x29;    // Select 键
        public const byte vbKeyPrint = 0x2A;     // PRINT SCREEN 键
        public const byte vbKeyExecute = 0x2B;   // EXECUTE 键
        public const byte vbKeySnapshot = 0x2C;  // SNAPSHOT 键
        public const byte vbKeyDelete = 0x2E;    // Delete 键
        public const byte vbKeyHelp = 0x2F;      // HELP 键
        public const byte vbKeyNumlock = 0x90;   // NUM LOCK 键

        //常用键 字母键A到Z
        public const byte vbKeyA = 65;
        public const byte vbKeyB = 66;
        public const byte vbKeyC = 67;
        public const byte vbKeyD = 68;
        public const byte vbKeyE = 69;
        public const byte vbKeyF = 70;
        public const byte vbKeyG = 71;
        public const byte vbKeyH = 72;
        public const byte vbKeyI = 73;
        public const byte vbKeyJ = 74; 
        public const byte vbKeyK = 75;
        public const byte vbKeyL = 76;
        public const byte vbKeyM = 77;
        public const byte vbKeyN = 78;
        public const byte vbKeyO = 79 ;
        public const byte vbKeyP = 80 ;
        public const byte vbKeyQ = 81 ;
        public const byte vbKeyR = 82 ;
        public const byte vbKeyS = 83 ;
        public const byte vbKeyT = 84 ;
        public const byte vbKeyU = 85 ;
        public const byte vbKeyV = 86 ;
        public const byte vbKeyW = 87 ;
        public const byte vbKeyX = 88 ;
        public const byte vbKeyY = 89 ;
        public const byte vbKeyZ = 90 ;

        //数字键盘0到9
        public const byte vbKey0 = 48 ;    // 0 键
        public const byte vbKey1 = 49 ;    // 1 键
        public const byte vbKey2 = 50 ;    // 2 键
        public const byte vbKey3 = 51 ;    // 3 键
        public const byte vbKey4 = 52 ;    // 4 键
        public const byte vbKey5 = 53 ;    // 5 键
        public const byte vbKey6 = 54 ;    // 6 键
        public const byte vbKey7 = 55 ;    // 7 键
        public const byte vbKey8 = 56 ;    // 8 键
        public const byte vbKey9 = 57 ;    // 9 键


        public const byte vbKeyNumpad0 = 0x60 ;    //0 键
        public const byte vbKeyNumpad1 = 0x61 ;    //1 键
        public const byte vbKeyNumpad2 = 0x62 ;    //2 键
        public const byte vbKeyNumpad3 = 0x63 ;    //3 键
        public const byte vbKeyNumpad4 = 0x64 ;    //4 键
        public const byte vbKeyNumpad5 = 0x65 ;    //5 键
        public const byte vbKeyNumpad6 = 0x66 ;    //6 键
        public const byte vbKeyNumpad7 = 0x67 ;    //7 键
        public const byte vbKeyNumpad8 = 0x68 ;    //8 键
        public const byte vbKeyNumpad9 = 0x69 ;    //9 键
        public const byte vbKeyMultiply = 0x6A ;   // MULTIPLICATIONSIGN(*)键
        public const byte vbKeyAdd = 0x6B ;        // PLUS SIGN(+) 键
        public const byte vbKeySeparator = 0x6C ;  // ENTER 键
        public const byte vbKeySubtract = 0x6D ;   // MINUS SIGN(-) 键
        public const byte vbKeyDecimal = 0x6E ;    // DECIMAL POINT(.) 键
        public const byte vbKeyDivide = 0x6F ;     // DIVISION SIGN(/) 键


        //F1到F12按键
        public const byte vbKeyF1 = 0x70 ;   //F1 键
        public const byte vbKeyF2 = 0x71 ;   //F2 键
        public const byte vbKeyF3 = 0x72 ;   //F3 键
        public const byte vbKeyF4 = 0x73 ;   //F4 键
        public const byte vbKeyF5 = 0x74 ;   //F5 键
        public const byte vbKeyF6 = 0x75 ;   //F6 键
        public const byte vbKeyF7 = 0x76 ;   //F7 键
        public const byte vbKeyF8 = 0x77 ;   //F8 键
        public const byte vbKeyF9 = 0x78 ;   //F9 键
        public const byte vbKeyF10 = 0x79 ;  //F10 键
        public const byte vbKeyF11 = 0x7A ;  //F11 键
        public const byte vbKeyF12 = 0x7B ;  //F12 键

        #endregion

2、引用win32api键盘函数

#region 引用win32api方法

        /// <summary>
        /// 导入模拟键盘的方法
        /// </summary>
        /// <param name="bVk" >按键的虚拟键值</param>
        /// <param name= "bScan" >扫描码,一般不用设置,用0代替就行</param>
        /// <param name= "dwFlags" >选项标志:0:表示按下,2:表示松开</param>
        /// <param name= "dwExtraInfo">一般设置为0</param>
        [DllImport("user32.dll")]
        public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

        #endregion

3、使用例子

2)按钮方法

/// <summary>
        /// 默认按下ctrl+shift切换输入法
        /// </summary>
        /// <param name= sender ></param>
        /// <param name= e ></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //模拟按下ctrl键
            keybd_event(vbKeyControl, 0,0,0);
            //模拟按下shift键
            keybd_event(vbKeyShift, 0, 0, 0);
            //松开按键ctrl
            keybd_event(vbKeyControl, 0, 2, 0);
            //松开按键shift
            keybd_event(vbKeyShift, 0, 2, 0);

        }

        /// <summary>
        /// 使用QQ的截图快捷按键(前提:开启QQ)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            //模拟按下ctrl键
            keybd_event(vbKeyControl, 0, 0, 0);
            //模拟按下Alt键
            keybd_event(vbKeyAlt, 0, 0, 0);
            //模拟按下A键
            keybd_event(vbKeyA, 0, 0, 0);
            //模拟松开ctrl键
            keybd_event(vbKeyControl, 0, 2, 0);
            //模拟松开Alt键
            keybd_event(vbKeyAlt, 0, 2, 0);
            //模拟松开A键
            keybd_event(vbKeyA, 0, 2, 0);
        }


        /// <summary>
        /// 模拟 Alt+F4按键 关闭窗体程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            //模拟按下Alt键
            keybd_event(vbKeyAlt, 0, 0, 0);
            //模拟按下F4键
            keybd_event(vbKeyF4, 0, 0, 0);
            //松开按键Alt
            keybd_event(vbKeyAlt, 0, 2, 0);
            //松开按键F4
            keybd_event(vbKeyF4, 0, 2, 0);
        }

        /// <summary>
        /// 模拟Ctrl+Alt+Z按键 显示已最小化QQ界面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            //模拟按下ctrl键
            keybd_event(vbKeyControl, 0, 0, 0);
            //模拟按下Alt键
            keybd_event(vbKeyAlt, 0, 0, 0);
            //模拟按下Z键
            keybd_event(vbKeyZ, 0, 0, 0);
            //模拟松开ctrl键
            keybd_event(vbKeyControl, 0, 2, 0);
            //模拟松开Alt键
            keybd_event(vbKeyAlt, 0, 2, 0);
            //模拟松开Z键
            keybd_event(vbKeyZ, 0, 2, 0);
        }

4、完整源码

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.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsForms
{
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }

        #region bVk参数 常量定义

        public const byte vbKeyLButton = 0x1;    // 鼠标左键
        public const byte vbKeyRButton = 0x2;    // 鼠标右键
        public const byte vbKeyCancel = 0x3;     // CANCEL 键
        public const byte vbKeyMButton = 0x4;    // 鼠标中键
        public const byte vbKeyBack = 0x8;       // BACKSPACE 键
        public const byte vbKeyTab = 0x9;        // TAB 键
        public const byte vbKeyClear = 0xC;      // CLEAR 键
        public const byte vbKeyReturn = 0xD;     // ENTER 键
        public const byte vbKeyShift = 0x10;     // SHIFT 键
        public const byte vbKeyControl = 0x11;   // CTRL 键
        public const byte vbKeyAlt = 18;         // Alt 键  (键码18)
        public const byte vbKeyMenu = 0x12;      // MENU 键
        public const byte vbKeyPause = 0x13;     // PAUSE 键
        public const byte vbKeyCapital = 0x14;   // CAPS LOCK 键
        public const byte vbKeyEscape = 0x1B;    // ESC 键
        public const byte vbKeySpace = 0x20;     // SPACEBAR 键
        public const byte vbKeyPageUp = 0x21;    // PAGE UP 键
        public const byte vbKeyEnd = 0x23;       // End 键
        public const byte vbKeyHome = 0x24;      // HOME 键
        public const byte vbKeyLeft = 0x25;      // LEFT ARROW 键
        public const byte vbKeyUp = 0x26;        // UP ARROW 键
        public const byte vbKeyRight = 0x27;     // RIGHT ARROW 键
        public const byte vbKeyDown = 0x28;      // DOWN ARROW 键
        public const byte vbKeySelect = 0x29;    // Select 键
        public const byte vbKeyPrint = 0x2A;     // PRINT SCREEN 键
        public const byte vbKeyExecute = 0x2B;   // EXECUTE 键
        public const byte vbKeySnapshot = 0x2C;  // SNAPSHOT 键
        public const byte vbKeyDelete = 0x2E;    // Delete 键
        public const byte vbKeyHelp = 0x2F;      // HELP 键
        public const byte vbKeyNumlock = 0x90;   // NUM LOCK 键

        //常用键 字母键A到Z
        public const byte vbKeyA = 65;
        public const byte vbKeyB = 66;
        public const byte vbKeyC = 67;
        public const byte vbKeyD = 68;
        public const byte vbKeyE = 69;
        public const byte vbKeyF = 70;
        public const byte vbKeyG = 71;
        public const byte vbKeyH = 72;
        public const byte vbKeyI = 73;
        public const byte vbKeyJ = 74; 
        public const byte vbKeyK = 75;
        public const byte vbKeyL = 76;
        public const byte vbKeyM = 77;
        public const byte vbKeyN = 78;
        public const byte vbKeyO = 79 ;
        public const byte vbKeyP = 80 ;
        public const byte vbKeyQ = 81 ;
        public const byte vbKeyR = 82 ;
        public const byte vbKeyS = 83 ;
        public const byte vbKeyT = 84 ;
        public const byte vbKeyU = 85 ;
        public const byte vbKeyV = 86 ;
        public const byte vbKeyW = 87 ;
        public const byte vbKeyX = 88 ;
        public const byte vbKeyY = 89 ;
        public const byte vbKeyZ = 90 ;

        //数字键盘0到9
        public const byte vbKey0 = 48 ;    // 0 键
        public const byte vbKey1 = 49 ;    // 1 键
        public const byte vbKey2 = 50 ;    // 2 键
        public const byte vbKey3 = 51 ;    // 3 键
        public const byte vbKey4 = 52 ;    // 4 键
        public const byte vbKey5 = 53 ;    // 5 键
        public const byte vbKey6 = 54 ;    // 6 键
        public const byte vbKey7 = 55 ;    // 7 键
        public const byte vbKey8 = 56 ;    // 8 键
        public const byte vbKey9 = 57 ;    // 9 键


        public const byte vbKeyNumpad0 = 0x60 ;    //0 键
        public const byte vbKeyNumpad1 = 0x61 ;    //1 键
        public const byte vbKeyNumpad2 = 0x62 ;    //2 键
        public const byte vbKeyNumpad3 = 0x63 ;    //3 键
        public const byte vbKeyNumpad4 = 0x64 ;    //4 键
        public const byte vbKeyNumpad5 = 0x65 ;    //5 键
        public const byte vbKeyNumpad6 = 0x66 ;    //6 键
        public const byte vbKeyNumpad7 = 0x67 ;    //7 键
        public const byte vbKeyNumpad8 = 0x68 ;    //8 键
        public const byte vbKeyNumpad9 = 0x69 ;    //9 键
        public const byte vbKeyMultiply = 0x6A ;   // MULTIPLICATIONSIGN(*)键
        public const byte vbKeyAdd = 0x6B ;        // PLUS SIGN(+) 键
        public const byte vbKeySeparator = 0x6C ;  // ENTER 键
        public const byte vbKeySubtract = 0x6D ;   // MINUS SIGN(-) 键
        public const byte vbKeyDecimal = 0x6E ;    // DECIMAL POINT(.) 键
        public const byte vbKeyDivide = 0x6F ;     // DIVISION SIGN(/) 键


        //F1到F12按键
        public const byte vbKeyF1 = 0x70 ;   //F1 键
        public const byte vbKeyF2 = 0x71 ;   //F2 键
        public const byte vbKeyF3 = 0x72 ;   //F3 键
        public const byte vbKeyF4 = 0x73 ;   //F4 键
        public const byte vbKeyF5 = 0x74 ;   //F5 键
        public const byte vbKeyF6 = 0x75 ;   //F6 键
        public const byte vbKeyF7 = 0x76 ;   //F7 键
        public const byte vbKeyF8 = 0x77 ;   //F8 键
        public const byte vbKeyF9 = 0x78 ;   //F9 键
        public const byte vbKeyF10 = 0x79 ;  //F10 键
        public const byte vbKeyF11 = 0x7A ;  //F11 键
        public const byte vbKeyF12 = 0x7B ;  //F12 键

        #endregion

        #region 引用win32api方法

        /// <summary>
        /// 导入模拟键盘的方法
        /// </summary>
        /// <param name="bVk" >按键的虚拟键值</param>
        /// <param name= "bScan" >扫描码,一般不用设置,用0代替就行</param>
        /// <param name= "dwFlags" >选项标志:0:表示按下,2:表示松开</param>
        /// <param name= "dwExtraInfo">一般设置为0</param>
        [DllImport("user32.dll")]
        public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

        #endregion

        /// <summary>
        /// 默认按下ctrl+shift切换输入法
        /// </summary>
        /// <param name= sender ></param>
        /// <param name= e ></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //模拟按下ctrl键
            keybd_event(vbKeyControl, 0,0,0);
            //模拟按下shift键
            keybd_event(vbKeyShift, 0, 0, 0);
            //松开按键ctrl
            keybd_event(vbKeyControl, 0, 2, 0);
            //松开按键shift
            keybd_event(vbKeyShift, 0, 2, 0);

        }

        /// <summary>
        /// 使用QQ的截图快捷按键(前提:开启QQ)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            //模拟按下ctrl键
            keybd_event(vbKeyControl, 0, 0, 0);
            //模拟按下Alt键
            keybd_event(vbKeyAlt, 0, 0, 0);
            //模拟按下A键
            keybd_event(vbKeyA, 0, 0, 0);
            //模拟松开ctrl键
            keybd_event(vbKeyControl, 0, 2, 0);
            //模拟松开Alt键
            keybd_event(vbKeyAlt, 0, 2, 0);
            //模拟松开A键
            keybd_event(vbKeyA, 0, 2, 0);
        }


        /// <summary>
        /// 模拟 Alt+F4按键 关闭窗体程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            //模拟按下Alt键
            keybd_event(vbKeyAlt, 0, 0, 0);
            //模拟按下F4键
            keybd_event(vbKeyF4, 0, 0, 0);
            //松开按键Alt
            keybd_event(vbKeyAlt, 0, 2, 0);
            //松开按键F4
            keybd_event(vbKeyF4, 0, 2, 0);
        }

        /// <summary>
        /// 模拟Ctrl+Alt+Z按键 显示已最小化QQ界面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            //模拟按下ctrl键
            keybd_event(vbKeyControl, 0, 0, 0);
            //模拟按下Alt键
            keybd_event(vbKeyAlt, 0, 0, 0);
            //模拟按下Z键
            keybd_event(vbKeyZ, 0, 0, 0);
            //模拟松开ctrl键
            keybd_event(vbKeyControl, 0, 2, 0);
            //模拟松开Alt键
            keybd_event(vbKeyAlt, 0, 2, 0);
            //模拟松开Z键
            keybd_event(vbKeyZ, 0, 2, 0);
        }
    }
}

5、执行后效果图

1)模拟QQ截图按键

 好了,本文到此结束,如果本文对你有帮助,资助2毛钱作为鼓励呗,穷逼一个,就当筹个网费吧

模拟鼠标和键盘 注意:不支持Windows 8 / 8.1。 Interceptor是Windows键盘驱动程序的包装器(包装http://oblita.com/Interception)。 使用驱动程序,Interceptor可以模拟按键和鼠标点击... 使用DirectX的游戏,通常不接受使用SendInput()的击键 Windows的受保护区域,如Windows登录屏幕或UAC调暗屏幕 任何应用程序 因为驱动程序模拟击键和鼠标单击,所以目标窗口必须处于活动状态(即,在发送击键和鼠标点击时,不能在另一个窗口上执行多任务)。 如何使用 下载并构建此项目并在项目中引用其DLL。 下载'interception.dll',这是一个由驱动程序作者编写的独立库。将它放在与可执行文件相同的目录中。这是必需的。 从作者的网页下载并安装“install-interception.exe”。安装后重新启动计算机。 在您的代码中,要加载驱动程序,请调用(阅读下面的代码注释;您必须设置过滤模式以捕获按键事件或发送按键操作!): Input input = new Input(); // Be sure to set your keyboard filter to be able to capture key presses and simulate key presses // KeyboardFilterMode.All captures all events; 'Down' only captures presses for non-special keys; 'Up' only captures releases for non-special keys; 'E0' and 'E1' capture presses/releases for special keys input.KeyboardFilterMode = KeyboardFilterMode.All; // You can set a MouseFilterMode as well, but you don't need to set a MouseFilterMode to simulate mouse clicks // Finally, load the driver input.Load(); 做你的东西。 input.MoveMouseTo(5, 5); // Please note this doesn't use the driver to move the mouse; it uses System.Windows.Forms.Cursor.Position input.MoveMouseBy(25, 25); // Same as above ^ input.SendLeftClick(); input.KeyDelay = 1; // See below for explanation; not necessary in non-game apps input.SendKeys(Keys.Enter); // Presses the ENTER key down and then up (this constitutes a key press) // Or you can do the same thing above using these two lines of code input.SendKeys(Keys.Enter, KeyState.Down); Thread.Sleep(1); // For use in games, be sure to sleep the thread so the game can capture all events. A lagging game cannot process input quickly, and you so you may have to adjust this to as much as 40 millisecond delay. Outside of a game, a delay of even 0 milliseconds can work (instant key presses). input.SendKeys(Keys.Enter, KeyState.Up); input.SendText("hello, I am typing!"); /* All these following characters / numbers / symbols work */ input.SendText("abcdefghijklmnopqrstuvwxyz"); input.SendText("1234567890"); input.SendText("!@#$%^&*()"); input.SendText("[]\\;',./"); input.SendText("{}|:\"?"); // And finally input.Unload(); 笔记: BadImageFormatException如果您没有为解决方案中的所有项目(包括此项目)使用正确的体系结构(x86或x64),则可能会获得。因此,您可能必须下载此项目的源代码才能将其重建为正确的体系结构。这应该很简单,构建过程应该没有错误。 您必须从http://oblita.com/Interception下载'interception.dll' 。 如果你已经完成了以上所有操作(正确安装了拦截驱动程序,将interception.dll放在你的项目文件夹中),你仍然无法发送击键: 驱动程序有一个限制,即它不能在不接收至少一次击键的情况下发送击键。这是因为驱动程序不知道键盘是哪个设备ID,因此它必须等待接收击键以从击键中推断出设备ID。 总之,在发送击键之前,请始终按键盘一次。点按任意键。然后你可以发送击键。这不适用于接收击键,因为通过接收击键,您当然已经按下了一个键。 MoveMouseTo()和MoveMouseBy()完全忽略键盘驱动程序。它使用System.Windows.Forms.Position来设置和获取游标的位置(它为下面的各个函数调用标准的Win32 API)。 原因是,在探索键盘驱动程序的鼠标移动功能时,我注意到它没有按像素单位移动光标,而是似乎通过加速移动光标。当我想将光标移动到某个位置时,这会不断产生不一致的值。因为Win32游标设置API通常不被游戏等阻止,所以我发现只需调用这些标准API即可,而无需使用驱动程序。请注意,这仅适用于设置光标位置。拦截光标仍然可以正常工作。例如,您可以使用Interceptor反转鼠标的x和y轴。
### 回答1: 在 TURBO C 2.0 中,您可以使用 biosdisk() 函数来格式化软盘。 下面是一段代码示例: ``` #include <stdio.h> #include <dos.h> int main() { // 定义扇区的大小 unsigned int sector_size[3] = {512, 512, 1024}; // 定义填充字节 unsigned char fill_char[3] = {0xF6, 0xF6, 0x48}; // 格式化磁道 70 面 0 的前三个扇区 for (int i = 0; i < 3; i++) { int result = biosdisk(2, 0, 70, 0, i + 1, 1, sector_size[i], fill_char[i]); if (result != 0) { printf("格式化扇区 %d 失败,返回码: %d\n", i + 1, result); } } return 0; } ``` 请注意,在使用 biosdisk() 函数之前,需要包含 dos.h 头文件。 希望这能帮到您! ### 回答2: 使用TURBO C 2.0语言,可以通过以下代码格式化软盘的70磁道0面,并分别格式化3个扇区,大小分别为512字节、512字节和1024字节。其中,前两个扇区使用F6填充,第三个扇区使用48填充。 ```c #include<stdlib.h> #include<stdio.h> #include<dos.h> void formatFloppyDisk(){ union REGS regs; regs.h.ah = 0x0;// To format a floppy disk, we set AH=0 regs.h.dl = 0;// Drive number (0=A, 1=B, etc.) regs.x.cx = 0;// Track number to format regs.h.dh = 0;// Head number regs.h.al = 0;// Sector size (0=default, 1=512 bytes, 2=1024 bytes, 3=2048 bytes etc.) int FILL_BYTE = 0;// The byte value to fill the sectors with during formatting int NUM_SECTORS = 3;// Number of sectors to format // To format 70th track 0th head regs.x.ax = 0x1301; // 0x13 = Reset disk system, 01H = Reset only specified drive int86(0x13, &regs, &regs); // BIOS interrupt to reset disk system for (int i=0; i<NUM_SECTORS; i++){ regs.x.ax = 0x3101; // 0x31 = Write Format, 01H = Format only current track regs.x.bx = 0x0001; // 0x00 = Drive A:, 01H = Head 1, 0 = Generate ID Field depending on the disk in the drive 1 = Keep the ID Field all zeros regs.x.cx = 0x0170; // Track number=70(0-79 range) regs.h.dh = 0x00; // Head number=0 or 1 regs.h.al = 0x02; // Control byte=always zero regs.x.dx = i+1; // Sector number starting from 1 regs.x.si = 0x0000; // segment and offset of read/write buffer regs.x.di = 0x0000; // segment and offset of result if(i == 2){ FILL_BYTE = 0x48; // Fill the third sector with 48 regs.x.ax = 0x3102; // 0x31 = Write Format, 02H = Format sequential tracks immediately following the one being formatted }else{ FILL_BYTE = 0xF6; // Fill the first two sectors with F6 } regs.h.ah = FILL_BYTE; // Fill the sector with specified byte int86(0x13, &regs, &regs); // BIOS interrupt to format the specified sector } } int main(){ formatFloppyDisk(); return 0; } ``` 上述代码使用了INT 0x13,即BIOS中断服务例程,来执行软盘格式化操作。通过设置寄存器的不同参数,可以指定要格式化的磁道、面、扇区大小和填充字节。在这个例子中,我们格式化了软盘70磁道0面的3个扇区,前两个扇区使用F6填充,第三个扇区使用48填充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值