[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.
  1. Đầ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.
  2. Tạo khóa token (chuỗi bảo mật).
  3. 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:

[VB.NET] INSTRUCTIONS FOR CREATING AN APPLICATION SECURITY LICENSE PRODUCT.
- Để xem Serial number HDD bạn có thể sử dụng câu lệnh MS-DOS
wmic diskdrive get serialnumber

[VB.NET] Instructions for creating an application security license product.

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.

on Thứ Sáu, 16 tháng 2, 2024 | , | A comment?

[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.

on Thứ Năm, 15 tháng 2, 2024 | , , , | A comment?

[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 để:
  1. Chọn ngày tháng trong các biểu đồ và lịch trình.
  2. Hiển thị các sự kiện hoặc hoạt động được lên kế hoạch trong tương lai.
  3. Chọn các khoảng thời gian trong các báo cáo hoặc thống kê.
  4. Lọc dữ liệu theo tháng hoặc năm trong các bảng dữ liệu.
  5. Đặ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.
Month picker thường được tích hợp vào các ứng dụng web và di động để giúp người dùng tương tác với thời gian một cách dễ dàng hơn và cải thiện trải nghiệm người dùng.

Để 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


PASSWORD UNZIP: 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.

[VB.NET] Instructions for converting HTML code to BB code
Bảng tag element của HTML và BBcode.
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. 

on Chủ Nhật, 11 tháng 2, 2024 | , , | A comment?

[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.

* Giao diện chương trình giải mã:


Ví dụ: Ta có bản từ điển md5 như bên dưới
 
a => 0cc175b9c0f1b6a831c399e269772661
b => e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98
laptrinhvb.net => d2427fd96f1690da5fba854a013a9e6a
admin => 21232f297a57a5a743894a0e4a801fc3

Khi chúng ta có được bảng cơ sỡ dữ liệu, ta có thể sử dụng nó để truy vấn kết quả.

- 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);
        }
    }
}

C. Thành Quả

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é.

on Thứ Bảy, 10 tháng 2, 2024 | , | A comment?

[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 trước, mình đã có chia sẽ bài viết này nhưng bằng ngôn ngữ C#.

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


Để 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é.

DOWNLOAD SOURCE CODE


PASSWORD UNZIP: HUNG.PRO.VN

on Thứ Năm, 8 tháng 2, 2024 | , | A comment?

[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:

[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)

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.

Video demo ứng dụng:

DOWNLOAD SOURCE CODE


PASSWORD UNZIP: HUNG.PRO.VN

on Thứ Ba, 6 tháng 2, 2024 | , | A comment?

[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.


[C#] Hướng dẫn sử dụng thư viện AutoITx lấy id và password Ultraviewer trên winform

Nếu là lập trình viên, chắc các bạn thường xuyên sử dụng Ultraviewer, khi gởi thông tin cho người khác nhờ fix lỗi hay support cho khách hàng.

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ọ.

Trong bài viết này mình sẽ dùng thư viện AutoItX C# thực hiện công việc sau:
  1. Mở ứng dụng ultraviewer, nếu ứng dụng cho chưa khởi động.
  2. Chờ ứng dụng đến khi nào hoàn thành get đầy đủ ID và PASSWORD.
  3. Copy thông tin vào clipboard.
Và bây giờ các bạn có thể dễ dàng dùng Ctrl +V hoặc paste để gởi thông tin remote cho người cần remote qua zalo, telegram...
[C#] Hướng dẫn sử dụng thư viện AutoITx lấy id và password Ultraviewer trên winform

Đầ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.

DOWNLOAD SOURCE CODE


PASSWORD UNZIP: HUNG.PRO.VN

on Thứ Hai, 5 tháng 2, 2024 | , , , | A comment?

[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

[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

Nhưng nếu bạn chạy app "Run As Administrator" thì nó lại trả về kết quả là "Administrator"

Nhưng mình muốn ở đây là, cho dù chạy thế nào vẫn phải trả đúng tên tài khoản mình đang login vào windows.

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.

DOWNLOAD SOURCE CODE


PASSWORD UNZIP: HUNG.PRO.VN

on Chủ Nhật, 4 tháng 2, 2024 | , , | A comment?

[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#:
[C#] Tự động show Popup các control như: Combobox, DateTimePicker

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.

DOWNLOAD SOURCE CODE


PASSWORD UNZIP: HUNG.PRO.VN

on Thứ Bảy, 3 tháng 2, 2024 | , | A comment?