[VB.NET] Instructions for creating an application security license product.
Hôm nay, mình xin hướng dẫn các bạn cách tạo License cho ứng dụng. Sau khi, tạo ứng dụng xong, nếu các bạn muốn phân phối ứng dụng của mình theo License product.
Ở bài viết này, mình hướng dẫn các bạn thuật toán cơ bản để bảo mật ứng dụng.
- Đầu tiên, mình lấy serial number của HDD. Vì serial number HDD là duy nhất, nên ứng dụng mình cài vào máy tính nào thì chỉ sử dụng được một máy, cài đặt vào ổ cứng khác thì ứng dụng sẽ không hoạt động.
- Tạo khóa token (chuỗi bảo mật).
- Sử dụng thuật toán SHA1, serial number HDD với token của mình. Bạn có thể sử dụng thuật toán MD5, hay 1 thuật toán mã hóa bất kỳ.
Giao diện ứng dụng:
- Để xem Serial number HDD bạn có thể sử dụng câu lệnh MS-DOSwmic diskdrive get serialnumber
Chúng ta bắt đầu Import thư viện.
Imports System.ComponentModel Imports System.Text Imports System.Security.Cryptography Imports System.Management Imports System.Data Imports System.Data.SqlClient
Tiếp theo là hàm lấy Serial number HDD.
Public Function GetDriveSerialNumber() As String
Dim hdd As New ManagementObjectSearcher("select * from Win32_DiskDrive")
Dim hd As ManagementObject
For Each hd In hdd.Get()
HDD_Serial = hd("SerialNumber")
Next
Return HDD_Serial
End Function
Tiếp tục hàm mã hóa SHA1.
Public Function SHA1(ByVal number As String) As String
Dim ASCIIENC As New ASCIIEncoding
Dim strreturn As String
strreturn = vbNullString
Dim bytesourcetxt() As Byte = ASCIIENC.GetBytes(number)
Dim SHA1Hash As New SHA1CryptoServiceProvider
Dim bytehash() As Byte = SHA1Hash.ComputeHash(bytesourcetxt)
For Each b As Byte In bytehash
strreturn &= b.ToString("X8")
Next
Return strreturn
End Function
Viết hàm tạo key license cho software
Private Sub btnCreateKey_Click(sender As Object, e As EventArgs) Handles btnCreateKey.Click
Dim key As String
key = SHA1(serialHDD.Trim & token)
txtLicenseKey.Text = key
End Sub
Viết hàm đăng ký license cho ứng dụng.
Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) Handles SimpleButton1.Click
Dim keyLicense As String = txtRegister.Text
Dim key As String
key = SHA1(serialHDD.Trim & token)
If (keyLicense = key) Then
saveData("update license set licensekey='" & keyLicense & "' where id=1")
Me.Hide()
Dim frm As New XtraForm1
frm.ShowDialog()
Else
MessageBox.Show("Key is not Valid!", "ERROR!")
End If
End Sub
Viết hàm kiểm tra khi chạy ứng dụng, ứng dụng đã được đăng ký hay chưa
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
lblserialHDD.Text = GetDriveSerialNumber().Trim()
'get serial key from data
Dim keyData As String
keyData = getData()
'get key from hdd serial with token sha1
Dim key As String
key = SHA1(serialHDD.Trim & token)
If keyData = key Then
Me.Hide()
Dim frm As New XtraForm1
frm.ShowDialog()
End If
End Sub
VIDEO DEMO ỨNG DỤNG
Chúc các bạn thành công với thủ thuật trên.
[VB.NET] Tutorial and source code
VB.NET, viết tắt của Visual Basic .NET, là ngôn ngữ lập trình hướng đối tượng hiện đại, là một phần của .NET framework do Microsoft phát triển. Nó là hậu duệ của ngôn ngữ Visual Basic (VB) gốc và cung cấp nền tảng mạnh mẽ và linh hoạt để phát triển các ứng dụng Windows, web và di động.
VB.NET kết hợp tính đơn giản và dễ sử dụng của ngôn ngữ Visual Basic gốc với sự mạnh mẽ và linh hoạt của .NET framework. Nó cung cấp một cú pháp quen thuộc và một bộ tính năng phong phú giúp nó trở thành ngôn ngữ dễ tiếp cận cho người mới bắt đầu, đồng thời cung cấp các khả năng nâng cao cho các nhà phát triển chuyên nghiệp.
Lập trình hướng đối tượng (OOP)
Một trong những tính năng chính của VB.NET là hỗ trợ lập trình hướng đối tượng (OOP). Điều này cho phép các nhà phát triển tổ chức mã của họ thành các lớp và đối tượng, cho phép tái sử dụng, đóng gói và mô đun hóa mã. Với OOP, các nhà phát triển có thể xây dựng các ứng dụng phức tạp bằng cách tạo các thành phần có thể tái sử dụng, nâng cao khả năng bảo trì và khả năng mở rộng.VB.NET cung cấp một bộ thư viện và framework toàn diện hỗ trợ phát triển ứng dụng. Nó tích hợp với .NET framework, cung cấp rất nhiều chức năng cho các tác vụ như truy cập cơ sở dữ liệu, xử lý tệp, kết nối mạng, v.v. Các nhà phát triển có thể sử dụng các thư viện này để xây dựng các ứng dụng mạnh mẽ và giàu tính năng một cách hiệu quả.
Ngôn ngữ này cũng hỗ trợ lập trình theo hướng sự kiện, trong đó các hành động và hành vi được kích hoạt bởi tương tác của người dùng hoặc sự kiện hệ thống. Các nhà phát triển có thể dễ dàng xử lý các sự kiện như nhấp nút, di chuyển chuột và nhập bàn phím để tạo các ứng dụng tương tác và phản hồi nhanh.
Phát triển ứng dụng nhanh (RAD)
Một điểm mạnh khác của VB.NET là khả năng phát triển ứng dụng nhanh (RAD). Nó cung cấp môi trường phát triển trực quan trong các công cụ như Visual Studio, nơi các nhà phát triển có thể thiết kế giao diện người dùng, điều khiển kéo và thả cũng như tạo cấu trúc ứng dụng của họ một cách trực quan. Điều này giúp dễ dàng xây dựng giao diện thân thiện với người dùng và tăng tốc quá trình phát triển.VB.NET tương thích cao với hệ điều hành Windows và tích hợp liền mạch với các công nghệ khác của Microsoft. Nó hỗ trợ xây dựng các ứng dụng Windows Forms, ứng dụng Windows Present Foundation (WPF) và ứng dụng web ASP.NET. Nó cũng cung cấp khả năng tương tác với các ngôn ngữ .NET khác, cho phép các nhà phát triển kết hợp mã được viết bằng C# hoặc các ngôn ngữ khác vào các dự án VB.NET của họ.
Hơn nữa, VB.NET khuyến khích các phương pháp hay nhất về bảo mật, xử lý lỗi và quản lý bộ nhớ. Nó cung cấp các cơ chế tích hợp để xử lý ngoại lệ, đảm bảo xử lý lỗi và không làm gián đoạn chức năng của ứng dụng. Nó cũng kết hợp các tính năng như thu thập rác, tự động quản lý việc phân bổ và giải phóng bộ nhớ, giúp viết mã mạnh mẽ và ổn định dễ dàng hơn.
[DEVEXPRESS] Month Picker in Winform C#
Xin chào các bạn, bài viết hôm nay mình tiếp tục hướng dẫn các bạn cách cấu hình thuộc tính DateEdit trên Devexpress Winform thành Month Picker.
[DEVEXPRESS] Tạo month picker trên DateEdit Winform C#
Month picker là một công cụ trực quan giúp người dùng chọn tháng và năm một cách dễ dàng hơn. Nó được sử dụng rộng rãi trong các ứng dụng web và di động để cho phép người dùng chọn thời gian hoặc thực hiện các hoạt động dựa trên thời gian.Cụ thể, month picker thường được sử dụng để:
- Chọn ngày tháng trong các biểu đồ và lịch trình.
- Hiển thị các sự kiện hoặc hoạt động được lên kế hoạch trong tương lai.
- Chọn các khoảng thời gian trong các báo cáo hoặc thống kê.
- Lọc dữ liệu theo tháng hoặc năm trong các bảng dữ liệu.
- Đặt ngày hết hạn hoặc ngày kết thúc cho các tác vụ hoặc dự án.
Để cấu hình DateEdit các bạn code các thuộc tính như bên dưới:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace MonthPickerDevexpress
{
public partial class Form1 : DevExpress.XtraEditors.XtraForm
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
var monthnames = new string[] { "Tháng 1", "Tháng 2", "Tháng 3", "04", "05", "06", "07", "08", "09", "10", "11","12", "" };
Thread.CurrentThread.CurrentCulture.DateTimeFormat.AbbreviatedMonthNames = monthnames;
Thread.CurrentThread.CurrentCulture.DateTimeFormat.MonthGenitiveNames = monthnames;
dateEdit1.Properties.EditMask = "MM/yyyy";
dateEdit1.Properties.UseMaskAsDisplayFormat = true;
dateEdit1.Properties.VistaCalendarViewStyle = DevExpress.XtraEditors.VistaCalendarViewStyle.YearView;
dateEdit1.Properties.CalendarView = DevExpress.XtraEditors.Repository.CalendarView.TouchUI;
}
}
}
Ở phần monthnames các bạn có thể nhập ngôn ngữ gì tùy ý bạn.
Chúc các bạn thành công.
DOWNLOAD SOURCE CODE
HUNG.PRO.VN[VB.NET] Instructions for converting HTML code to BB code
Bài viết hôm nay, mình xin hướng dẫn các bạn cách chuyển đổi code từ code HTML to BBcode. Trong bài viết trước, mình đã có làm một bài hướng dẫn về cách đăng tin tự động lên diễn đàn Xenforo. Để đăng lên được các diễn đàn Forum, các bạn cần phải convert code từ HTML sang BBcode, thì post nó mới hiểu.
Dưới đây, là hàm convert HTML to BBcode, các bạn chỉ cần sử dụng Regular Expression đề xử lý.
Các bạn có thể tìm hiểu bài Regular trong lập trình Csharp để tham khảo.
FULL CODE
Public Function FormatHtmlIntoBBCode(desc As String) As String
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<br(.*?)>", "[br]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<br(.*?)>", "[br]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<ul[^>]*>", "[ulist]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "", "[/ulist]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<ol[^>]*>", "[olist]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "", "[/olist]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<li>", "[*]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "</li>", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<b>", "[b]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "</b>", "[/b]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<strong>", "[strong]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "</strong>", "[/strong]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<u>", "[u]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "</u>", "[/u]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<i>", "[i]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "</i>", "[/i]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<em>", "[em]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "</em>", "[/em]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<sup>", "[sup]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "</sup>", "[/sup]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<sub>", "[sub]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "</sub>", "[/sub]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<hr[^>]*>", "[hr]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<strike>", "[strike]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "</strike>", "[/strike]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<h1>", "[h1]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "</h1>", "[/h1]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<h2>", "[h2]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "</h2>", "[/h2]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<h3>", "[h3]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, "</h3>", "[/h3]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
'desc = System.Text.RegularExpressions.Regex.Replace(desc, "[br]", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
Dim match As System.Text.RegularExpressions.MatchCollection = System.Text.RegularExpressions.Regex.Matches(desc, "<img[ss]*?src=""([ss]*?)""[ss]*?>", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
If match.Count > 0 Then
desc = System.Text.RegularExpressions.Regex.Replace(desc, match(0).ToString(), "[img]" + match(0).Groups(1).Value + "[/img]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
End If
desc = System.Text.RegularExpressions.Regex.Replace(desc, "<a href="" ",="" "[url=", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, " <="" a="">", "[/url]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
'desc = System.Text.RegularExpressions.Regex.Replace(desc, "<span style="" color:",="" "[color=", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
'desc = System.Text.RegularExpressions.Regex.Replace(desc, " <="" span="">", "[/color]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = System.Text.RegularExpressions.Regex.Replace(desc, """>", "]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
desc = desc.Replace("[br]", "")
desc = desc.Replace("<p>", "")
desc = desc.Replace("</p>", "")
Return desc
End Function
Chúc các bạn thành công với thủ thuật trên.
[VB.NET] Encrypted using Md5, Sha1, Sha256, Sha512
Hôm nay, mình xin hướng dẫn các bạn cách Giải mã chuỗi đã được mã hóa bằng thuật toán MD5, Sha1, Sha256, Sha512...
Nhiều bạn không biết, thường đặt câu hỏi, các thuật toán mã hóa trên đều được mã hóa một chiều, tức là không có thể dịch ngược lại.
Nhưng tại sao lại có thể giải mã được.
+ Đúng là những thuật toán trên đều được mã hóa một chiều, nên chúng ta không thể giải mã được.
Chính vì thế, chúng ta sẽ xây dựng bộ từ điển cho chúng bằng cách lưu trong cơ sở dữ liệu.
a =>
0cc175b9c0f1b6a831c399e269772661b =>
e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98laptrinhvb.net =>
d2427fd96f1690da5fba854a013a9e6aadmin =>
21232f297a57a5a743894a0e4a801fc3- Các bạn có thể tự xây dựng bộ từ điển mã hóa cho riêng mình.
Trên mạng, hiện nay có rất nhiều trang web hỗ trợ giải mã các thuật toán trên, họ đã xây dựng cho chúng ta bộ từ điển để chúng ta có thể tra cứu.
Thông thường, thì khi chúng ta, cần tìm một chuỗi mã hóa thì trên web đều bắt chúng ta nhập captcha để chúng ddos.
- Hôm nay, mình xin giới thiệu trang web Md5 encrypt and Decrypt, đã cung cấp cho chúng ta truy vấn bằng cách sử dụng qua API của nó cung cấp.
Các bước thực hiện giải mã một chuỗi:
+ Đầu tiên: Các bạn vào đường dẫn sau để đăng ký API.
+ Sau khi đăng ký, nó sẽ cung cấp cho chúng ta một token để sử dụng truy vấn dữ liệu thông qua địa chỉ email mình đã đăng ký
- Cú pháp để giải mã:
$hash = "5f4dcc3b5aa765d61d8327deb882cf99"; $hash_type = "md5"; $email = "exemple@test.com"; $code = "0123456789"; $reponse = file_get_contents("http://md5decrypt.net/Api/api.php?hash=".$hash."&hash_type=".$hash_type."&email=".$email."&code=".$code); echo $reponse;
FULL CODE CHƯƠNG TRÌNH.
Public Class Form1
Private Sub btnDecrypt_Click(sender As Object, e As EventArgs) Handles btnDecrypt.Click
Dim email As String = "hung.pro.vn@gmail.com"
Dim token As String = "499a6997b538e3c9"
Dim hash As String = txtInput.Text
Dim hashType As String = cboType.Text
Dim url As String = "http://md5decrypt.net/Api/api.php?hash=" & hash & "&hash_type=" & hashType & "&email=" & email & "&code=" & token
WebBrowser1.Navigate(url)
End Sub
End Class
Chúc các bạn thành công với thủ thuật trên.
[C#] Logging data from Arduino to Excel
I. Giới thiệu
Xin chào các bạn, hôm nay mình sẽ giải đáp thắc mắc : Làm thế nào để ghi dữ liệu vào Excel thông qua C#? Mình cũng thấy trên cộng đồng có bài viết rất hay của a NTP_PRO nói về vấn đề này rồi, nhưng a NTP_PRO sử dụng Processing. Nhưng hôm nay, mình sẽ hướng dẫn các bạn bằng C# - Một hướng tiếp cận rất hay!!!II. Tiến hành thôi
a. Cách thức- Đầu tiên, các bạn mở Visual C# và tạo 1 Console Application. Thực hiện với chương trình Console - làm việc gần gũi với ngôn ngữ C#. Chỉ cần thực hiện thành công trên Console Application là các bạn có thể làm trên WinForm ngon lành thoy!!!
Sau đó, bạn có 1 Project Console Application, để làm 1 chương trình ghi dữ liệu vào Excel...Trước tiên, bạn Add Library thư viện dùng cho Microsoft Office Excel bằng cách sau :
- Chọn Project >> Add Reference
- Hộp thoại Add Reference hiện ra, bạn chọn thẻ COM...Chọn Library muốn Add, ở đây là Microsoft Office Excel Library...(version bn đó, tùy vào bạn đang sử dụng Office phiên bản nào)
Sau đó, các bạn kết nối using namespace:
using Excel = Microsoft.Office.Interop.Excel;
Đối tượng của excel này bao gồm: - Application (chương trình excel) - Workbook (file xls làm việc, có nhiều workbook trong app)
- Worksheet (có nhiều worksheet trong workbook)
// Khởi động chtr Excell
Excel.Application exApp = new Excel.Application();
// Thêm file temp xls
Excel.Workbook exBook = exApp.Workbooks.Add(
Excel.XlWBATemplate.xlWBATWorksheet );
// Lấy sheet 1.
Excel.Worksheet exSheet = (Excel.Worksheet)exBook.Worksheets[1];
Thay vì tạo 1 file Temp excel thì mình cũng có thể mở 1 file excel có sẵn:
string workbookPath = "c:/SomeWorkBook.xls";
COMExcel.Workbook exBook = exApp.Workbooks.Open(workbookPath,
0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
Sau đó nếu mình sử dụng:
exSheet.Name = "hung.pro.vn";
Thì Sheet của Excel sẽ như thế này:
Tiếp tục là Range (nó là một khối ô select, nó cũng có thể chỉ là 1 ô) Như vậy để ghi dữ liệu lên Ô thứ (A1) thì chúng ta sẽ làm như sau:
// Range là ô [1,1] (A1)
COMExcel.Range r = (COMExcel.Range) exSheet.Cells[1, 1];
// Ghi dữ liệu
r.Value2 = "Demo excel value";
// Giãn cột
r.Columns.AutoFit();
// Hiển thị chương trình excel
exApp.Visible = true;
// Đóng chương trình excel
Console.WriteLine("Đợi file Excel chạy");
Console.ReadLine();
exApp.Quit();
Hoặc bạn cũng có thể làm việc theo 1 khối như sau:
COMExcel.Range r = (COMExcel.Range)exSheet.get_Range("A1", "A4");
r.Value2 = "My Value";
r.Columns.AutoFit();
Công việc cuối cùng là save file nếu như bạn ko muốn hiện cửa sổ:
// Ẩn chương trình
exApp.Visible = false;
// Save file
exBook.SaveAs("C:\\file.xls", COMExcel.XlFileFormat.xlWorkbookNormal,
null,null,false,false,
COMExcel.XlSaveAsAccessMode.xlExclusive,
false,false,false,false,false);
exApp.Quit();
Excel là một đối tượng dạng COM và ngoài sự quản lý của CLR nên tốt nhất cuối cùng bạn nên khử đối tượng này.
exBook.Close(false, false, false); exApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(exBook); System.Runtime.InteropServices.Marshal.ReleaseComObject(exApp);
B. FULL CODE
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Excel;
namespace Ghi_du_lieu_Excel
{
class Program
{
static void Main(string[] args)
{
Excel.Application exApp = new Excel.Application();
Excel.Workbook exBook = exApp.Workbooks.Add(
Excel.XlWBATemplate.xlWBATWorksheet);
// Lấy sheet 1.
Excel.Worksheet exSheet = (Excel.Worksheet)exBook.Worksheets[1];
exSheet.Name = "Arduino.vn";
// Range là ô [1,1] (A1)
Excel.Range a = (Excel.Range)exSheet.Cells[1, 1];
Excel.Range t = (Excel.Range)exSheet.Cells[2, 1];
// Ghi dữ liệu
a.Value2 = "Cộng đồng Arduino";
t.Value2 = "Đỗ Hữu Toàn";
// Giãn cột
a.Columns.AutoFit();
Console.WriteLine("Đang chạy file Excel lên");
// Hiển thị chương trình excel
exApp.Visible = true;
Thread.Sleep(5000);
// Ẩn chương trình
exApp.Visible = false;
// Save file
exBook.SaveAs("E:\\file.xls", Excel.XlFileFormat.xlWorkbookNormal,
null, null, false, false,
Excel.XlSaveAsAccessMode.xlExclusive,
false, false, false, false, false);
exBook.Close(false, false, false);
exApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(exBook);
}
}
}
III. Lời kết
Trên đây, là cách ghi dữ liệu vào Excel bằng C#, các bạn có thể kết hợp với bài C# ( C Sharp ) - Nhận dữ liệu từ Arduino của mình để tạo ra những dự án thú vị. Vào những bài tiếp theo, mình sẽ nói rõ hơn về nó. Các bạn hãy chờ đợi Series bài viết về C# của mình nhé.[C#] Creating Serial Monitor from (Csharp)
Sau khi đọc bài viết C sharp (C#) - Một cách điều khiển ARDUINO bằng máy tính !!! của Đinh Hồng Thái mình thấy rất hay và muốn phát triển nó...Trong đầu mình chợt lóe lên những ý tưởng với C#. Mình tự đặt câu hỏi: Làm thế nào để tự tạo ra 1 Serial Monitor của chính mình!!! Qua một thời gian tìm hiểu, mình đã thành công!!!
I. Thiết kế giao diện chính và trang trí
Như những bài trước, các bạn sẽ thiết kế 1 giao diện cho app của mình như sau:Ngoài ra các bạn kéo thêm
timer1 vào, serialPort1, StatusTrip....ngoài ra có thể trang trí bằng lịch, hay hình ảnh cho nguy hiểm!!! timer1 các bạn thiết lập Properties như sau:II. Code
Sau khi xong phần thiết kế giao diện các bạn nạp code cho từng Form:Form1:
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;
// Thêm 3 em này vào là OK, để sài SerialPort
using System.IO;
using System.IO.Ports;
using System.Xml;
using System.Threading;// khởi tạo hàm Threading
namespace nhandulieuCOM
{
public partial class Form1 : Form
{
string InputData = String.Empty; // Khai báo string buff dùng cho hiển thị dữ liệu sau này.
delegate void SetTextCallback(string text); // Khai bao delegate SetTextCallBack voi tham so string
public Form1()
{
//cái Thread thực ra để chạy Form3 khi ms zô...cho ngầu
Thread t = new Thread(new ThreadStart(SplashScreen));//tạo 1 Thread t là SplashScreen
t.Start();// khi chương trình bật thỳ chạy t...tức là gọi SplashScreen
Thread.Sleep(4500);//ngủ 4,5s
InitializeComponent();
t.Abort();//sau đó đóng t
// Khai báo hàm delegate bằng phương thức DataReceived của Object SerialPort;
// Cái này khi có sự kiện nhận dữ liệu sẽ nhảy đến phương thức DataReceive
// Nếu ko hiểu đoạn này bạn có thể tìm hiểu về Delegate, còn ko cứ COPY . Ko cần quan tâm
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceive);
string[] BaudRate = { "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200" };
comboBox2.Items.AddRange(BaudRate);// Thiết lập cho comboBox2
}
private void SplashScreen()
{
Application.Run(new Form3());//chạy Form3
}
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DataSource = SerialPort.GetPortNames();
comboBox2.SelectedIndex = 3;
}
private void timer1_Tick(object sender, EventArgs e)
{
if (!serialPort1.IsOpen)
{
button2.Enabled = true;
button1.Enabled = false;
Thongbao.Text = ("Bạn chưa kết nối, hãy chọn một cổng COM để kết nối nhé!!! keke !! Arduino.vn");
Thongbao.ForeColor = Color.Red;
}
else if (serialPort1.IsOpen)
{
button2.Enabled = false;
button1.Enabled = true;
Thongbao.Text = ("Đã kết nối nhé!!! keke");
Thongbao.ForeColor = Color.Green;
}
}
private void DataReceive(object obj, SerialDataReceivedEventArgs e)
{
InputData = serialPort1.ReadExisting();
if (InputData != String.Empty)
{
// txtIn.Text = InputData; // Ko dùng đc như thế này vì khác threads .
SetText(InputData); // Chính vì vậy phải sử dụng ủy quyền tại đây. Gọi delegate đã khai báo trước đó.
}
}
// Hàm của em nó là ở đây. Đừng hỏi vì sao lại thế.
private void SetText(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText); // khởi tạo 1 delegate mới gọi đến SetText
this.Invoke(d, new object[] { text });
}
else this.textBox1.Text += text;
}
private void button2_Click(object sender, EventArgs e)
{
if (!serialPort1.IsOpen)
{
serialPort1.PortName = comboBox1.Text;
serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
serialPort1.Open();
}
}
private void button1_Click(object sender, EventArgs e)
{
serialPort1.Close();
}
private void button5_Click(object sender, EventArgs e)
{
// Hiện tí thông báo..cho ngầu
if (serialPort1.IsOpen)// đã kết nối thì
{
//nếu chưa nhập
if (textBox2.Text == "") MessageBox.Show("Nhập dữ liệu cần gửi vào nhé!!!", "Đỗ Hữu Toàn - Thông báo");
else
serialPort1.Write(textBox2.Text);// ngược lại...gửi giá trị từ textBox tới cổng COM
}
// Nếu cổng COM chưa kết nối
else MessageBox.Show("Kết nối cổng COM đi bạn", "Đỗ Hữu Toàn - Thông báo");
textBox2.Clear();
}
private void button3_Click(object sender, EventArgs e)
{
textBox2.Clear();
textBox1.Clear();
//Ấn xóa clear hết textbox
}
private void button4_Click(object sender, EventArgs e)
{
DialogResult stt = MessageBox.Show("Bạn chắc chắn muốn thoát chương trình???", "Đỗ Hữu Toàn - Arduino.vn", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (stt == DialogResult.Yes ) MessageBox.Show("Cảm ơn bạn đã sử dụng chương trình, nhớ Rate Note ủng hộ mình nhé","Đỗ Hữu Toàn - Arduino.vn");
Close();
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Form2 tacgia = new Form2();
tacgia.ShowDialog();
// chạy form2 khi ấn nút tác giả ( linklabel1)
}
}
}
Form 2:
(chỉ là phần logo..k cóa code nhé)
Form 3:
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 nhandulieuCOM
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
//Khi timer làm tươi...tăng 1 đơn vị cho progessBar
progressBar1.Increment(1);
if(progressBar1.Value == 100)
{
// Nếu ProgessBar = 100..Tức là Max r đó
timer1.Stop();// thì sop timer..ngừng làm tươi..ngừng tăng processBar
}
}
}
}
III. Kết quả
Trên đây là cách chế tạo Serial Monitor của mình...Các bạn xem và góp ý nhé!!! Chúc các bạn thành công!!![VB.NET] CRUD REALTIME DATABASE FIREBASE
Xin chào các bạn, bài viết hôm nay mình xin chia sẽ đến các bạn Source code thêm, xóa, sửa, tìm kiếm CRUD với Realtime Database (Firebase) bằng ngôn ngữ VB.NET Winform.
[VB.NET] CRUD Thêm xóa sửa tìm kiếm Realtime FireBase
Trong bài viết này, mình có source code của tác giả Project AM, mình chia sẽ đến các bạn nào cần thao tác với Firebase bằng ngôn ngữ VB.NET.
Dưới đây là giao diện demo ứng dụng:![[VB.NET] CRUD Thêm xóa sửa tìm kiếm Realtime FireBase [VB.NET] CRUD Thêm xóa sửa tìm kiếm Realtime FireBase](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggcujwqkyx_W9MGp-H3EiHA4Ud2DnAfdWNkj4QZy95u87xFsS8mrJwKnGYwjVJiy9hShYW1g9maAagTwua7NvuvTa4LyTW28OEB6sti_EBkGANBmfE1B0GIsSqMrUH9TYGdJWJZxYRMik-09I7i12VSt8Mm8jSbdFvTVqwALTqQtvmNc-lc3V9LpAe-Gw/w640-h435-rw/firebase_crud_vb_net.gif)
Để lưu trữ hình ảnh lên Database Firebase, chúng ta sẽ mã hóa hình ảnh sang dạng BASE64 để lưu trữ chúng.
FULL CODE CRUD FIREBASE VB.NET
Imports FireSharp.Config
Imports FireSharp.Response
Imports FireSharp.Interfaces
Imports System.Web.Script.Serialization '(Importing System.Web.Script.Serialization) This is used to read and convert JSON strings.
Imports System.ComponentModel '(Importing System.ComponentModel) This is used to sort data on DataGridView.
Imports System.IO '(Importing System.IO) This is used for ImageToBase64 Public Functions and Base64ToImage Public Functions.
Public Class Form1
Dim IMG_FileNameInput As String 'This variable is used to hold the address and file name of the image that will be displayed in the registration section.
Dim clearDGVCol As Boolean = True
Private dtTableGrd As DataTable 'This variable is used to search data on DataGridView.
'-------------------------------------------Configure FireSharp
Private fcon As New FirebaseConfig() With
{
.AuthSecret = "afojSxW25t6PgEl98qmLSanufOI3jKkGG552XaoW",
.BasePath = "https://laptrinhvb-c96be.firebaseio.com/"
}
Private client As IFirebaseClient
'-------------------------------------------
Public Function ImageToBase64(image As Image) As String
Using ms As New MemoryStream()
' Convert Image to byte[]
Dim Format As System.Drawing.Imaging.ImageFormat = Imaging.ImageFormat.Jpeg
image.Save(ms, Format)
Dim imageBytes As Byte() = ms.ToArray()
' Convert byte[] to Base64 String
Dim base64String As String = Convert.ToBase64String(imageBytes)
Return base64String
End Using
End Function
Public Function Base64ToImage(base64String As String) As Image
' Convert Base64 String to byte[]
Dim imageBytes As Byte() = Convert.FromBase64String(base64String)
Dim ms As New MemoryStream(imageBytes, 0, imageBytes.Length)
' Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length)
Dim image__1 As Image = System.Drawing.Image.FromStream(ms, True)
Return image__1
End Function
'-------------------------------------------
Sub DisplayRegSave(Stat As Boolean)
TBName.Enabled = Stat
TBID.Enabled = Stat
CBGender.Enabled = Stat
CBGender.Enabled = Stat
BtnSave.Enabled = Stat
BtnClearAll.Enabled = Stat
End Sub
Sub DisplayRecLoad(Stat As Boolean)
TBSearch.Enabled = Stat
CBSearchBy.Enabled = Stat
BtnEdit.Enabled = Stat
BtnDelete.Enabled = Stat
BtnRefresh.Enabled = Stat
BtnClearSelection.Enabled = Stat
DGVUserData.Enabled = Stat
End Sub
'-------------------------------------------
'-------------------------------------------Sub to load data from database and display in DataGridView.
Sub ShowRecord()
Try
Dim dtTable As New DataTable
dtTable.Columns.Add("Name")
dtTable.Columns.Add("ID")
dtTable.Columns.Add("Gender")
dtTable.Columns.Add("City")
dtTable.Columns.Add("Image", GetType(Image))
'-------------------------------------------Conditions for deleting columns. This was executed only once.
If clearDGVCol = True Then
DGVUserData.Columns.Clear()
clearDGVCol = False
End If
'-------------------------------------------
Dim SRRecord = client.Get("PersonDB/") 'To load and hold Database in JSON file format.
'-------------------------------------------To converts the specified JSON string to an object of type T.
'-------------------------------------------For more information see here :
'-------------------------------------------https://docs.microsoft.com/en-us/dotnet/api/system.web.script.serialization.javascriptserializer.deserialize?view=netframework-4.8
Dim myJsonTool As New JavaScriptSerializer
Dim myDeserializedItems = myJsonTool.Deserialize(Of Dictionary(Of String, PersonalData))(SRRecord.Body)
'-------------------------------------------
'-------------------------------------------To enter a Database (in JSON file format that has been previously converted into an object form) into a Table.
For Each dictItem As KeyValuePair(Of String, PersonalData) In myDeserializedItems
dtTable.Rows.Add(dictItem.Value.Name,
dictItem.Value.ID,
dictItem.Value.Gender,
dictItem.Value.City,
Base64ToImage(dictItem.Value.Image))
Next
'-------------------------------------------
DGVUserData.DataSource = dtTable 'Gets or sets the data source that the DataGridView is displaying data for.
dtTableGrd = dtTable 'Entering data from dtTable into dtTableGrd, dtTableGrd is used to find data and display it on DataGridView.
Dim imageColumn = DirectCast(DGVUserData.Columns("Image"), DataGridViewImageColumn)
imageColumn.ImageLayout = DataGridViewImageCellLayout.Zoom
'-------------------------------------------
DGVUserData.Sort(DGVUserData.Columns(0), ListSortDirection.Ascending)
LblTotalUser.Text = "Total Users : " & DGVUserData.RowCount
Me.Text = "VB Net Firebase RealTime Database"
LabelRecordView.Text = "Record View"
DisplayRecLoad(True)
DGVUserData.ClearSelection()
Catch ex As Exception
If ex.Message = "One or more errors occurred." Then
MessageBox.Show("Cannot connect to firebase, check your network !", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
ElseIf ex.Message = "Object reference not set to an instance of an object." Then
Dim dtTable As New DataTable
dtTable.Columns.Add("Name")
dtTable.Columns.Add("ID")
dtTable.Columns.Add("Gender")
dtTable.Columns.Add("City")
dtTable.Columns.Add("Image", GetType(Image))
DGVUserData.DataSource = dtTable
MessageBox.Show("Database not found or Database is empty.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageBox.Show(ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Me.Text = "VB Net Firebase RealTime Database"
LabelRecordView.Text = "Record View"
DisplayRecLoad(True)
End Try
End Sub
'-------------------------------------------
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
client = New FireSharp.FirebaseClient(fcon)
BtnRefresh_Click(sender, e)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
CBSearchBy.SelectedIndex = 0
End Sub
Private Sub BtnCreateID_Click(sender As Object, e As EventArgs) Handles BtnCreateID.Click
Try
TBID.Text = "Please wait..."
Dim r As Random = New Random
Dim num As Integer
num = (r.Next(1, 99999))
Dim IDresults As String = Strings.Right("00000" & num.ToString(), 5)
Dim Check_ID = client.Get("PersonDB/" + IDresults)
'-------------------------------------------Conditions to check whether the ID has been used.
If Check_ID.Body <> "null" Then
MessageBox.Show("The same ID is found, create another ID by pressing the Create ID button.", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
TBID.Text = IDresults
End If
'-------------------------------------------
Catch ex As Exception
If ex.Message = "One or more errors occurred." Then
TBID.Clear()
MessageBox.Show("Cannot connect to firebase, check your network !", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
TBID.Clear()
MessageBox.Show(ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
End Try
End Sub
Private Sub BtnSave_Click(sender As Object, e As EventArgs) Handles BtnSave.Click
If BtnSave.Text = "Save" Then 'Conditions for storing data to the database.
If TBName.Text = Nothing Then
MessageBox.Show("Name field is empty." & vbCrLf & "Please fill in the name field to continue.", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
If TBID.Text = Nothing Then
MessageBox.Show("ID field is empty." & vbCrLf & "Please fill in the name field to continue.", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
If CBGender.Text = Nothing Then
MessageBox.Show("Gender field is empty." & vbCrLf & "Please fill in the name field to continue.", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
If TBCity.Text = Nothing Then
MessageBox.Show("City field is empty." & vbCrLf & "Please fill in the name field to continue.", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
If IMG_FileNameInput = Nothing Then
MessageBox.Show("Image file has not been entered." & vbCrLf & "Please enter the image to continue.", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
Try
Me.Text = "VB Net Firebase RealTime Database (Saving. Please wait...)"
LabelRegistration.Text = "Registration (Saving. Please wait...)"
DisplayRegSave(False)
Dim ImgData As String = ImageToBase64(PictureBoxUserReg.Image)
Dim PD As New PersonalData() With
{
.Name = TBName.Text,
.ID = TBID.Text,
.Gender = CBGender.Text,
.City = TBCity.Text,
.Image = ImgData
}
Dim save = client.Set("PersonDB/" + TBID.Text, PD) 'To save data to Firebase Database.
DisplayRegSave(True)
LabelRegistration.Text = "Registration"
Me.Text = "VB Net Firebase RealTime Database"
MessageBox.Show("Data saved successfully.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
BtnClearAll_Click(sender, e)
BtnRefresh_Click(sender, e)
Catch ex As Exception
If ex.Message = "One or more errors occurred." Then
MessageBox.Show("Cannot connect to firebase, check your network !", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
MessageBox.Show(ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
DisplayRegSave(True)
LabelRegistration.Text = "Registration"
Me.Text = "VB Net Firebase RealTime Database"
End Try
Else 'Conditions for updating data to a database.
If TBName.Text = Nothing Then
MessageBox.Show("Name field is empty." & vbCrLf & "Please fill in the name field to continue.", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
If TBCity.Text = Nothing Then
MessageBox.Show("City field is empty." & vbCrLf & "Please fill in the name field to continue.", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
Try
Me.Text = "VB Net Firebase RealTime Database (Updating. Please wait...)"
LabelRegistration.Text = "Registration (Updating. Please wait...)"
DisplayRegSave(False)
Dim ImgData As String = ImageToBase64(PictureBoxUserReg.Image)
Dim PD As New PersonalData() With
{
.Name = TBName.Text,
.ID = TBID.Text,
.Gender = CBGender.Text,
.City = TBCity.Text,
.Image = ImgData
}
Dim update = client.Update("PersonDB/" + TBID.Text, PD) 'To update data to Firebase Database.
DisplayRegSave(True)
LabelRegistration.Text = "Registration"
Me.Text = "VB Net Firebase RealTime Database"
MessageBox.Show("Data updated successfully.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
BtnClearAll_Click(sender, e)
BtnRefresh_Click(sender, e)
Catch ex As Exception
If ex.Message = "One or more errors occurred." Then
MessageBox.Show("Cannot connect to firebase, check your network !", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
MessageBox.Show(ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
DisplayRegSave(True)
LabelRegistration.Text = "Registration"
Me.Text = "VB Net Firebase RealTime Database"
End Try
End If
End Sub
Private Sub PictureBoxUserReg_Click(sender As Object, e As EventArgs)
OpenFileDialogUserImage.FileName = ""
OpenFileDialogUserImage.Filter = "JPEG (*.jpeg;*.jpg)|*.jpeg;*.jpg"
If (OpenFileDialogUserImage.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then
IMG_FileNameInput = OpenFileDialogUserImage.FileName
PictureBoxUserReg.ImageLocation = IMG_FileNameInput
End If
End Sub
Private Sub BtnClearAll_Click(sender As Object, e As EventArgs) Handles BtnClearAll.Click
TBName.Clear()
TBID.Clear()
CBGender.Text = Nothing
TBCity.Clear()
PictureBoxUserReg.Image = My.Resources.avatar
IMG_FileNameInput = Nothing
BtnSave.Text = "Save"
BtnCreateID.Enabled = True
End Sub
Private Sub BtnRefresh_Click(sender As Object, e As EventArgs) Handles BtnRefresh.Click
Me.Text = "VB Net Firebase RealTime Database (Loading. Please wait...)"
LabelRecordView.Text = "Record View (Loading. Please wait...)"
DisplayRecLoad(False)
ShowRecord()
End Sub
Private Sub BtnEdit_Click(sender As Object, e As EventArgs) Handles BtnEdit.Click
'-------------------------------------------The condition to check whether the data to be edited has been selected in DataGridView
If DGVUserData.SelectedRows.Count = 0 Then
MessageBox.Show("Please select one row in the table to edit.", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
'-------------------------------------------
'-------------------------------------------Conditions to check whether there is more than one data selected on DataGridView.
If DGVUserData.SelectedRows.Count > 1 Then
MessageBox.Show("You select " & DGVUserData.SelectedRows.Count & " rows in the Table." & vbCrLf & "The Edit feature can only edit one row in a table.", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
'-------------------------------------------
If DGVUserData.SelectedRows.Count = 1 Then
TBName.Text = DGVUserData.SelectedRows(0).Cells("Name").Value
TBID.Text = DGVUserData.SelectedRows(0).Cells("ID").Value
CBGender.Text = DGVUserData.SelectedRows(0).Cells("Gender").Value
TBCity.Text = DGVUserData.SelectedRows(0).Cells("City").Value
PictureBoxUserReg.Image = DGVUserData.Rows(DGVUserData.SelectedRows(0).Index).Cells("Image").Value
BtnSave.Text = "Update"
End If
End Sub
Private Sub BtnDelete_Click(sender As Object, e As EventArgs) Handles BtnDelete.Click
'-------------------------------------------Conditions for deleting all data in the database.
If AllCellsSelected(DGVUserData) = True Then
Try
If MsgBox("Are you sure you want to delete all data ?", MsgBoxStyle.Question + MsgBoxStyle.OkCancel, "Confirmation") = MsgBoxResult.Cancel Then Return
Me.Text = "VB Net Firebase RealTime Database (Deleting. Please wait...)"
LabelRecordView.Text = "Record View (Deleting. Please wait...)"
DisplayRecLoad(False)
Dim deleteAll = client.Delete("PersonDB") 'To delete data in the Firebase Database
MessageBox.Show("Data successfully deleted.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
Me.Text = "VB Net Firebase RealTime Database"
LabelRecordView.Text = "Record View"
DisplayRecLoad(True)
BtnRefresh_Click(sender, e)
Return
Catch ex As Exception
If ex.Message = "One or more errors occurred." Then
MessageBox.Show("Cannot connect to firebase, check your network !", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
MessageBox.Show(ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Me.Text = "VB Net Firebase RealTime Database"
LabelRecordView.Text = "Record View"
DisplayRecLoad(True)
End Try
End If
'-------------------------------------------
'-------------------------------------------Conditions for deleting one data or several data in the Database.
Try
If DGVUserData.SelectedRows.Count = 0 Then
MessageBox.Show("Please select one row or several rows to be deleted.", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
If MsgBox("Are you sure you want to delete this data ?", MsgBoxStyle.Question + MsgBoxStyle.OkCancel, "Confirmation") = MsgBoxResult.Cancel Then Return
Me.Text = "VB Net Firebase RealTime Database (Deleting. Please wait...)"
LabelRecordView.Text = "Record View (Deleting. Please wait...)"
DisplayRecLoad(False)
For Each row As DataGridViewRow In DGVUserData.SelectedRows
If row.Selected = True Then
Dim delete = client.Delete("PersonDB/" & row.DataBoundItem(1).ToString)
End If
Next
MessageBox.Show("Data successfully deleted.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
Me.Text = "VB Net Firebase RealTime Database"
LabelRecordView.Text = "Record View"
DisplayRecLoad(True)
BtnRefresh_Click(sender, e)
Catch ex As Exception
If ex.Message = "One or more errors occurred." Then
MessageBox.Show("Cannot connect to firebase, check your network !", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
MessageBox.Show(ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Me.Text = "VB Net Firebase RealTime Database"
LabelRecordView.Text = "Record View"
DisplayRecLoad(True)
End Try
'-------------------------------------------
End Sub
Private Function AllCellsSelected(dgv As DataGridView) As Boolean
If dgv.RowCount = 0 Then
AllCellsSelected = False
Return AllCellsSelected
End If
AllCellsSelected = (dgv.SelectedCells.Count = (dgv.RowCount * dgv.Columns.GetColumnCount(DataGridViewElementStates.Visible)))
If dgv.RowCount = 1 Then
AllCellsSelected = False
End If
End Function
Private Sub BtnClearSelection_Click(sender As Object, e As EventArgs) Handles BtnClearSelection.Click
DGVUserData.ClearSelection()
End Sub
Private Sub TBSearch_TextChanged(sender As Object, e As EventArgs)
'dtTableGrd.DefaultView.RowFilter = CBSearchBy.Text & " Like '" & TBSearch.Text & "%'" 'To search for data on the DataGridView
DGVUserData.ClearSelection()
End Sub
Private Sub EditToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EditToolStripMenuItem.Click
BtnEdit_Click(sender, e)
End Sub
Private Sub DeleteToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DeleteToolStripMenuItem.Click
BtnDelete_Click(sender, e)
End Sub
Private Sub SelectAllToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SelectAllToolStripMenuItem.Click
DGVUserData.SelectAll()
End Sub
Private Sub ClearSelectionToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ClearSelectionToolStripMenuItem.Click
BtnClearSelection_Click(sender, e)
End Sub
Private Sub TBSearch_TextChanged_1(sender As Object, e As EventArgs) Handles TBSearch.TextChanged
dtTableGrd.DefaultView.RowFilter = CBSearchBy.Text & " Like '" & TBSearch.Text & "%'" 'To search for data on the DataGridView
DGVUserData.ClearSelection()
End Sub
Private Sub PictureBoxUserReg_Click_1(sender As Object, e As EventArgs) Handles PictureBoxUserReg.Click
OpenFileDialogUserImage.FileName = ""
OpenFileDialogUserImage.Filter = "JPEG (*.jpeg;*.jpg)|*.jpeg;*.jpg"
If (OpenFileDialogUserImage.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then
IMG_FileNameInput = OpenFileDialogUserImage.FileName
PictureBoxUserReg.ImageLocation = IMG_FileNameInput
End If
End Sub
End Class
Chúc các bạn thành công với thủ thuật này nhé.
[VB.NET] INSTRUCTIONS FOR CONVERTING BINARY (BIN), decimal (DEC) AND HEXdecimal (HEX)
Xin chào các bạn, bài viết hôm nay mình sẽ hướng dẫn các bạn cách chuyển đổi qua lại giữa các hệ cơ số: nhị phân (Binary), thập phân (Decimal), thập lục phân (Hexadecimal) trong lập trình VB.NET.
1. Hệ nhị phân là gì?
Hệ nhị phân (hay hệ đếm cơ số hai) là một hệ đếm dùng hai ký tự để biểu đạt một giá trị số, bằng tổng số các lũy thừa của 2. Như vậy, hệ nhị phân (tiếng Anh gọi là binary) là hệ đếm chỉ dùng 2 chữ số thay vì 10 chữ số như hệ thập phân, và 2 chữ số này thường là 0 và 1. Chính cái tên của nó cũng nói lên điều này: “nhị” tức là 2, “thập” tức là 10.2. Hệ thập phân là gì?
Hệ thập phân (hệ đếm cơ số 10) là hệ đếm dùng số 10 làm cơ số. Đây là hệ đếm được sử dụng rộng rãi nhất trong các nền văn minh thời hiện đại.3. Hệ thập lục phân là gì?
Hệ thập lục phân (hay hệ đếm cơ số 16, tiếng Anh: hexadecimal), hoặc chỉ đơn thuần gọi là thập lục, là một hệ đếm có 16 ký tự, từ 0 đến 9 và A đến F (chữ hoa và chữ thường như nhau). Hệ thống thập lục phân hiện dùng, được công ty IBM giới thiệu với thế giới điện toán vào năm 1963. Một phiên bản cũ của hệ thống này, dùng các con số từ 0 đến 9, và các con chữ A đến F, đã được sử dụng trong máy tính Bendix G-15, ra mắt năm 1956.Giao diện demo ứng dụng VB.NET:
SOURCE CODE CONVERT BIN, DEC, HEX VB.NET
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Strconvert As String = TextBox1.Text
Dim Decimals As Integer
Dim hexadecimal As String
Dim Binary As String
Dim x As Integer
' convert Binary to Binary
If ComboBox1.Text = "Binary" And ComboBox2.Text = "Binary" Then
TextBox2.Text = TextBox1.Text
' convert Binary to Decimal
ElseIf ComboBox1.Text = "Binary" And ComboBox2.Text = "Decimal"
Decimals = Convert.ToInt32(Strconvert, 2)
TextBox2.Text = Decimals.ToString
' convert Binary to Hexadecimal
ElseIf ComboBox1.Text = "Binary" And ComboBox2.Text = "Hexadecimal"
Decimals = Convert.ToInt32(Strconvert, 2)
hexadecimal = Convert.ToString(Decimals, 16)
TextBox2.Text = hexadecimal
' convert Decimal to Binary
ElseIf ComboBox1.Text = "Decimal" And ComboBox2.Text = "Binary"
x = Convert.ToInt32(Strconvert)
Binary = Convert.ToString(x, 2)
TextBox2.Text = Binary
' convert Decimal to Hexadecimal
ElseIf ComboBox1.Text = "Decimal" And ComboBox2.Text = "Hexadecimal"
x = Convert.ToInt32(Strconvert)
hexadecimal = Convert.ToString(x, 16)
TextBox2.Text = hexadecimal
' convert Hexadecimal to Binary
ElseIf ComboBox1.Text = "Hexadecimal" And ComboBox2.Text = "Binary"
Decimals = Convert.ToInt32(Strconvert, 16)
Binary = Convert.ToString(Decimals, 2)
TextBox2.Text = Binary
' convert Hexadecimal to Decimal
ElseIf ComboBox1.Text = "Hexadecimal" And ComboBox2.Text = "Decimal"
Decimals = Convert.ToInt32(Strconvert, 16)
TextBox2.Text = Decimals.ToString
Else
If ComboBox1.Text = "Select Format" Or ComboBox2.Text = "Select Format" Or ComboBox1.Text = "" Or ComboBox2.Text = "" Then
MsgBox("Please Insert Select type to convert")
End If
End If
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Add items into ComboBox1
ComboBox1.Items.Add("Binary")
ComboBox1.Items.Add("Decimal")
ComboBox1.Items.Add("Hexadecimal")
' Add items into ComboBox1
ComboBox2.Items.Add("Binary")
ComboBox2.Items.Add("Decimal")
ComboBox2.Items.Add("Hexadecimal")
' Add Text into ComboBox1
ComboBox1.Text = "Select Format"
' Add Text into ComboBox1
ComboBox2.Text = "Select Format"
End Sub
End Class
Chúc các bạn thành công với thủ thuật này nhé.
[VB.NET] Calendar and Reminder App Winform
Xin chào các bạn, bài viết hôm nay mình chia sẻ các bạn source code lịch âm dương và kèm theo chức năng nhắc lịch làm việc bằng VB.NET.
[VB.NET] Chia sẻ source code lịch âm dương và hẹn lịch nhắc việc
Dưới đây, là hình ảnh giao diện lịch ứng dụng:Thông tin bao gồm: Lịch âm và lịch dương.
Lịch âm thông báo cho biết có năm nhuận hay không, Thuộc ngày giờ nào, giáp nào.
Ngoài ra, bạn có thể đặt lịch hẹn giờ để show thông báo.
Các bạn có thể thêm xóa dễ dàng danh sách lịch hẹn này.
Các bạn có thể download source về và custom lại theo ý của các bạn.
[C#] How to get id and password ultraviewer
Xin chào các bạn, bài viết hôm nay mình hướng dẫn các bạn các tự động lấy id và password trên ultraviewer sử dụng thư viện AutoIT trên C#, winform.
Nếu các bạn, chụp màn hình mà gởi, hoặc thậm chí có nhiều bạn dùng điện thoại chụp gởi cho người mình nhờ cần support.
Thì người support cho bạn, có cảm giác rất khó chịu. Và nhiều khi không muốn fix lỗi cho bạn nữa.
Nên khi bạn muốn nhờ ai đó, remote để sửa fix bug cho mình thì phải copy id và mật khẩu cụ thể gởi họ.
- Mở ứng dụng ultraviewer, nếu ứng dụng cho chưa khởi động.
- Chờ ứng dụng đến khi nào hoàn thành get đầy đủ ID và PASSWORD.
- Copy thông tin vào clipboard.
Đầu tiền, các bạn cài đặt thư viện AutoIt từ nuget:
NuGet\Install-Package AutoItX.Dotnet -Version 3.3.14.5
Full source code C#:
using AutoIt;
using System;
using System.Drawing;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TestAutoIT
{
public partial class Form1 : Form
{
public string pathAppUltraviewer = "C:\\Program Files (x86)\\UltraViewer\\UltraViewer_Desktop.exe";
public string titleApp = "UltraViewer 6.6 - Free";
public Form1()
{
InitializeComponent();
this.Size = new Size(1, 1);
this.StartPosition = FormStartPosition.Manual;
this.Location = new Point(-1000, -1000);
// Show the form
this.Show();
}
protected override async void OnLoad(EventArgs e)
{
base.OnLoad(e);
AutoItX.Run(pathAppUltraviewer, "", AutoItX.SW_SHOW);
AutoItX.WinWait(titleApp, "");
var credentials = await GetCredentialsAsync();
Clipboard.SetText($"{credentials.Item1}\n{credentials.Item2}");
var infoUltraviewer = $"{credentials.Item1}\n{credentials.Item2}";
string localAppDataFolder = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
string zaloPath = Path.Combine(localAppDataFolder, "Programs", "Zalo", "Zalo.exe");
////Toast.Build(this, infoUltraviewer).Show();
AutoItX.Run(zaloPath, "", AutoItX.SW_SHOW);
//AutoItX.WinWaitActive("Zalo");
//IntPtr windowHandle = AutoItX.WinGetHandle("[CLASS:Chrome_WidgetWin_1];[TITLE:Zalo]");
//if (windowHandle != IntPtr.Zero)
//{
// var windowInfo = AutoItX.WinGetPos(windowHandle);
// int centerX = windowInfo.X + windowInfo.Width / 2;
// int centerY = windowInfo.Y + windowInfo.Height / 2;
// AutoItX.MouseClick("left", centerX, centerY);
//}
//else
//{
// Console.WriteLine("Failed to get window handle.");
//}
//SendTextWithDelay($"Thông tin Ultraviewer: ", 10);
//AutoItX.Send("{ENTER}");
//SendTextWithDelay($"{credentials.Item1}", 100);
//AutoItX.Send("{ENTER}");
//SendTextWithDelay($"{credentials.Item2}", 100);
//AutoItX.Send("{ENTER}");
Application.Exit();
}
public void SendTextWithDelay(string text, int delayBetweenCharacters)
{
foreach (char c in text)
{
AutoItX.Send(c.ToString());
System.Threading.Thread.Sleep(delayBetweenCharacters);
}
}
private Task<(string, string)> GetCredentialsAsync()
{
var tcs = new TaskCompletionSource<(string, string)>();
ThreadPool.QueueUserWorkItem(state =>
{
string username = "";
string password = "";
do
{
username = AutoItX.ControlGetText(titleApp, "", "[CLASS:WindowsForms10.EDIT.app.0.34f5582_r15_ad1; INSTANCE:3]");
Thread.Sleep(100);
} while (username == string.Empty);
password = AutoItX.ControlGetText(titleApp, "", "[CLASS:WindowsForms10.EDIT.app.0.34f5582_r15_ad1; INSTANCE:4]");
tcs.SetResult((username, password));
});
return tcs.Task;
}
}
}
Chúc các bạn thành công với thủ thuật trên.
[VB.NET] How to get user logined in Winform throught Run app as Administrator
Xin chào các bạn, bài viết hôm nay mình tiếp tục hướng dẫn các bạn cách lấy tên tài khoản user đăng nhập trên Windows bằng ngôn ngữ VB.NET, và cách khởi động lại ứng dụng với chế độ Admin.
[VB.NET] Hướng dẫn lấy thông tin tài khoản đăng nhập windows và khởi động lại ứng dụng ở chế độ Administrator
Thông thường, các bạn sử dụng lệnh dưới đây để lấy thông tin tài khoản đang đăng nhập vào windows.
Imports System.Security.Principal
Module Module1
Sub Main()
Dim userName As String = System.Security.Principal.WindowsIdentity.GetCurrent().Name
Console.WriteLine("User Name: " & userName)
Console.ReadLine()
End Sub
End Module
Giống như hình ảnh, các bạn thấy mình đang đăng nhập vào Windows bằng tài khoản Guest.
Khi sử dụng lên trên nếu ứng dụng chúng ta chạy chế độ bình thường thì nó sẽ trả về kết quả là: Guest
Giải pháp:
Mình sẽ sử dụng lệnh query user trên CMD, để lấy thông tin user session đang Active vào C#.Source code VB.NET:
Imports System.Management
Imports System.Text.RegularExpressions
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim currentUser = GetCurrentUserLoginedWindows()
MessageBox.Show(currentUser)
End Sub
Public Function GetCurrentUserLoginedWindows() As String
Dim queryPath As String = String.Empty
If Environment.Is64BitOperatingSystem AndAlso Not Environment.Is64BitProcess Then
queryPath = System.IO.Path.Combine(Environment.GetEnvironmentVariable("windir"), "Sysnative", "query.exe")
Else
queryPath = System.IO.Path.Combine(Environment.GetEnvironmentVariable("windir"), "System32", "query.exe")
End If
Dim startInfo As New ProcessStartInfo(queryPath)
startInfo.Arguments = "user"
startInfo.CreateNoWindow = True
startInfo.RedirectStandardError = True
startInfo.RedirectStandardOutput = True
startInfo.UseShellExecute = False
startInfo.WindowStyle = ProcessWindowStyle.Hidden
Using p As New Process With {
.StartInfo = startInfo,
.EnableRaisingEvents = True
}
p.Start()
p.WaitForExit()
Dim result As String = p.StandardOutput.ReadToEnd()
Dim dataTable As New DataTable()
Dim lines As String() = result.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
Dim column = 0
For Each line As String In lines
Dim pattern As String = "\s{2,}"
Dim columns As String() = Regex.Split(line.Trim(), pattern)
If column = 0 Then
For Each col As String In columns
dataTable.Columns.Add(col)
Next
column = column + 1
Else
Dim row As DataRow = dataTable.NewRow()
For i As Integer = 0 To Math.Min(dataTable.Columns.Count - 1, columns.Length - 1)
row(i) = columns(i)
Next
dataTable.Rows.Add(row)
End If
Next
Return dataTable.AsEnumerable().Where(Function(x) x.Field(Of String)("STATE") = "Active").FirstOrDefault()("USERNAME").ToString().Replace(">", "")
End Using
End Function
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim args = Environment.GetCommandLineArgs()
Dim psi = New ProcessStartInfo() With {
.FileName = args(0),
.UseShellExecute = True,
.Verb = "runas"
}
Process.Start(psi)
Environment.Exit(0)
End Sub
End Class
Ở trong source code này mình cũng đã tích hợp cách chạy lại ứng dụng dưới quyền Administrator.
Chúc các bạn thành công với thủ thuật này.
[C#] How to show popup Combobox, DateTimePicker Dynamic
Xin chào các bạn, bài viết hôm nay mình sẻ hướng dẫn các bạn cách show popup các control trên winform như: Combobox, DateTimePicker.
[C#] Tự động show Popup các control như: Combobox, DateTimePicker
Ví dụ: Khi các bạn thiết kế form nhập thông tin.Nếu người dùng chưa chọn dữ liệu, thì mình sẽ thông báo lỗi kèm show luôn popup lên cho người dùng bắt buộc phải chọn dữ liệu.
Giao diện demo ứng dụng Auto show popup C#:
FULL CODE CSHARP:
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 AutoShowPopupCombobox
{
public partial class Form1 : Form
{
[DllImport("user32.dll")]
private static extern bool PostMessage(
IntPtr hWnd, // handle to destination window
Int32 msg, // message
Int32 wParam, // first message parameter
Int32 lParam // second message parameter
);
const Int32 WM_LBUTTONDOWN = 0x0201;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ShowPopupControl(comboBox1);
}
public void ShowPopupControl(Control control) {
var x = control.Width - 10;
var y = control.Height / 2;
var lParam = x + y * 0x00010000;
PostMessage(control.Handle, WM_LBUTTONDOWN, 1, lParam);
}
private void button2_Click(object sender, EventArgs e)
{
ShowPopupControl(dateTimePicker1);
}
private void btnclick_Click(object sender, EventArgs e)
{
ShowPopupControl(button4);
}
private void button4_Click(object sender, EventArgs e)
{
MessageBox.Show("Button 4 clicked!");
}
}
}
Chúc các bạn thành công với thủ thuật trên.

![[VB.NET] INSTRUCTIONS FOR CREATING AN APPLICATION SECURITY LICENSE PRODUCT. [VB.NET] INSTRUCTIONS FOR CREATING AN APPLICATION SECURITY LICENSE PRODUCT.](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbylFe1ocaLKblHiMwakDNL58Zo8S-5jYKCuwXrTXYN00p3WP0avUGuFgf02ETkSg3kTwU7Ff-F2eGwa2OBASDDAbFpEjSs7TUp0GxGKI0yWxIGrl0-NE72HexmQNgTGJ3Qa3CDX47QS719uEuM7GPi_bqaqbu_dzQg6gSKZnvJX4txXI2xjqC5YdaKQQ/w640-h480-rw/security_license_product.png)
![[VB.NET] Instructions for creating an application security license product. [VB.NET] Instructions for creating an application security license product.](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVYxUjH6hTW4Z6LiUA9YC3W6acojYb6UmRHHKWxBpL_XySxwLcTeDhxLL594X7kpipJwdGn_dfc4K-qCU-1ABtxzpJgaoIIIHG9BTp65bh2xfFoRaOnhuw65xi3GMrvMR0gc4t-gwdHVd8ugZSGvwaRquQYhoNHwQ2v8p-USLF-RWcYyy4SOZEEZIObtQ/w640-h299-rw/serial%20number%20hdd.png)

![[VB.NET] Instructions for converting HTML code to BB code [VB.NET] Instructions for converting HTML code to BB code](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFKYFMHR6nZ29g_0_bncOMY06k2IfcuQVyndmnkfLJGqryfxllSn8faYGGzioqGzvOM2WARC8kCZuIi-FLaO7st7ZJnb3djM2cNniv_P5idtq7SykDHxK_7dMkDFTlYZP6FYx30lWcutbsf3oqBh9uFVD2Xpg1_8phaNHqQNonJM23q5S39KdfAo1pw28/s600-rw/html_to_bbcode.png)







![[VB.NET] Hướng dẫn chuyển đổi qua lại các hệ số nhị phân (Bin), thập phân (Dec) và thập lục phân (Hex) [VB.NET] Hướng dẫn chuyển đổi qua lại các hệ số nhị phân (Bin), thập phân (Dec) và thập lục phân (Hex)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1YSLTiOUmktETR0DhUjz3m2FlxEESdUFvmQ_lhz1fE-Zq0nTweuo5OFE-EGhpo68GzDhOxm2VVxVztj5vxXzY2ZlMeP1raeS0YDutQsE-76D62NGZO-51mS7BcDfqxsZ8tmGuP8xCejrfWrwbitUEip87U4ndWZdVKzWeCTIReMXTnVuyPx-0HEK8mzI/w640-h374-rw/convert_bin_hex.jpg)


![[C#] Hướng dẫn sử dụng thư viện AutoITx lấy id và password Ultraviewer trên winform [C#] Hướng dẫn sử dụng thư viện AutoITx lấy id và password Ultraviewer trên winform](https://cdn.hung.pro.vn/images/img/b/R29vZ2xl/AVvXsEgBonoA27pB8GJNgBJOZfBwPwpbAlKqt2MhkOUfeGjBz5bRe_k0eP5ELPO5J8bJ_MSnl45qNyKhTLE3rfWdsCEFdUGYid4jiMouoQdwR5OZxO1BdAjSYEZl2zdKLdZpMaowRamxVRJpn5P7vnMfyy61Bt3G4fIDQAp9-EeFEAcYSh3kXmRP28zvsCyXbTw/w640-h262/auto_it_info.png)
![[VB.NET] Hướng dẫn lấy thông tin tài khoản đăng nhập windows và khởi động lại ứng dụng ở chế độ Administrator [VB.NET] Hướng dẫn lấy thông tin tài khoản đăng nhập windows và khởi động lại ứng dụng ở chế độ Administrator](https://cdn.hung.pro.vn/images/img/b/R29vZ2xl/AVvXsEhjVS1RZJKjS2d5xWG-x5bsLf5D2snGt-_Ah7Ttj_N2BqXGikp0xHXxAYTbTG7LOlpAC_NnJNrXVN4atVI0258AAqk7SmAsqN5GGZFNO40jFdsWeo0tQ9tN-zNSG3NGOM5b9dGlZmaQwr9VQXslJQZ9jKdjU8w_8xCs2ysHnpFYIlInbvP4tYjs-Ina6xw/w640-h354/acc_windows.png)

![[C#] Tự động show Popup các control như: Combobox, DateTimePicker [C#] Tự động show Popup các control như: Combobox, DateTimePicker](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd_qjWsVlo5ut6Kk5TDducWrT8nTsv7WDxqEMhDCXZEvqPHCV4yVwgdlWUDwJClge6CmE8FDxcpWLl8V18i2ExlBda3dMOx3hf3Ibru4Jdz8e7elXFN6tPn4XqD_I4fafXfqc_3Kem1i3h4IdS2bJbNMBfRkhpWIm_1VV8pPy9h2yrGKNOCFRBfg9-GRQ/w640-h223-rw/show_popup.gif)