Trang 1 trên 1

Chèn thêm chi tiết vào desktop

Đã gửi: T.Tư 25/08/2010 5:11 pm
gửi bởi vo_minhdat2007
Thủ thuật: Chèn thêm chi tiết vào desktop
Tác giả: vo_minhdat2007
Mô tả: Có thể ứng dụng làm chương trình lịch, ...



Khởi đầu, Import 2 namespace cần dùng:

  1. Imports System.Runtime.InteropServices
  2. Imports Microsoft.Win32


Trước tiên, ta lấy đường dẫn wallpaper hiện tại (của Windows lưu riêng ra, không phải là file gốc đâu!). Có 2 cách: lấy trực tiếp bằng Registry (ngắn) và dùng API (cho biết thôi, không nên dùng :P)

Dùng Registry:

  1.     Dim UserWallpaper As RegistryKey = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", False)
  2.         'Lấy đường dẫn wallpaper hiện tại
  3.         Dim Path As String = UserWallpaper.GetValue("Wallpaper")


Dùng API:

  1.     <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
  2.     Public Shared Function SystemParametersInfo(ByVal uAction As UInt32, ByVal uParam As Integer, ByVal lpvParam As String, ByVal fuWinIni As Integer) As Integer
  3.     End Function
  4.  
  5.     Public Function GetCurrentDesktopWallpaper() As String
  6.         Dim currentWallpaper As New String(ControlChars.NullChar, MAX_PATH)
  7.         SystemParametersInfo(SPI_GETDESKWALLPAPER, currentWallpaper.Length, currentWallpaper, 0)
  8.         Return currentWallpaper.Substring(0, currentWallpaper.IndexOf(ControlChars.NullChar))
  9.     End Function


Sau đó, dùng Graphics để thay đổi, vẽ vời gì đó tùy thích :P

  1.         'Tạo bitmap từ file đó và vẽ chuỗi lên
  2.         Dim bm As New Bitmap(Path)
  3.         Dim gr As Graphics = Graphics.FromImage(bm)
  4.         gr.DrawString("Made by vo_minhdat2007", Me.Font, Brushes.Red, 0, 0)


Tham khảo them về Graphics tại đây: viewtopic.php?f=23&t=3840

Cuối cùng, lưu lại và đặt nó làm Desktop mới:

Khai báo API này:

  1.     Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Integer, ByVal uParam As Integer, ByVal lpvParam As String, ByVal fuWinIni As Integer) As Integer
  2.     Private Const SPI_SETDESKWALLPAPER = 20
  3.     Private Const SPIF_UPDATEINIFILE = &H1


Code trong chương trình chính:

  1.         'Lưu lại
  2.         bm.Save("C:\Temp.bmp")
  3.         'Đặt làm hình nền mới
  4.         SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\Temp.bmp", SPIF_UPDATEINIFILE)
  5.  


Vậy là xong, đây là kết quả :D

Hình ảnh
Hình ảnh

Re: Chèn thêm chi tiết vào desktop

Đã gửi: T.Tư 25/08/2010 6:10 pm
gửi bởi volcano2409
Nhưng mà làm sao có thể chèn một tấm hình nào đó từ form vào dc :-?

Re: Chèn thêm chi tiết vào desktop

Đã gửi: T.Sáu 20/01/2012 4:54 pm
gửi bởi TheDark
Làm theo cách của mod Đạt dường như không ổn lắm.
Mình thấy thế này:
- Đâu tiên mình lấy file "C:\A.bmp" làm hình nền bằng tay.
- Sau đó chạy phần mềm. Điều hiển nhiên là Path = @"C:\.........\themes\........\ABC.jpg"; và ABC.jpg là một hình y chan A.bmp;
- Tiếp theo đó tạo đối tượng bitmap "bm" từ Path, sau đó vẽ vời lên nó. Ví dụ mình vẽ "ngày hôm nay" (ngày hôm nay là 20) lên. Xong rồi thì lưu lại với tên temp.bmp ở ổ đĩa C:\
- Dùng API set wallpaper = C:\temp.bmp
- Vì wallpaper đã thay đỗi. HĐH sẽ tạo ra file @"C:\.........\themes\........\ABC.jpg" , là một hình y chan temp.bmp;
Vấn đề bắt đầu khi mình chạy phần mềm vào ngày hôm sau.
- File mình lấy được từ Registry không phải là file hình nền y chang A.bmp nữa. Nó file đã được mình vẽ lên hôm qua temp.bmp. Và hôm nay mình vẽ lên nữa => Failed

Re: Chèn thêm chi tiết vào desktop

Đã gửi: CN 22/01/2012 7:55 am
gửi bởi VuVanHoanh
Cách anh Đạt nếu xài desktop Win 7, cho nhiều ảnh làm desktop thì có hoạt động được k anh?

Re: Chèn thêm chi tiết vào desktop

Đã gửi: CN 22/01/2012 8:37 am
gửi bởi vo_minhdat2007
TheDark đã viết:Làm theo cách của mod Đạt dường như không ổn lắm.
Mình thấy thế này:
- Đâu tiên mình lấy file "C:\A.bmp" làm hình nền bằng tay.
- Sau đó chạy phần mềm. Điều hiển nhiên là Path = @"C:\.........\themes\........\ABC.jpg"; và ABC.jpg là một hình y chan A.bmp;
- Tiếp theo đó tạo đối tượng bitmap "bm" từ Path, sau đó vẽ vời lên nó. Ví dụ mình vẽ "ngày hôm nay" (ngày hôm nay là 20) lên. Xong rồi thì lưu lại với tên temp.bmp ở ổ đĩa C:\
- Dùng API set wallpaper = C:\temp.bmp
- Vì wallpaper đã thay đỗi. HĐH sẽ tạo ra file @"C:\.........\themes\........\ABC.jpg" , là một hình y chan temp.bmp;
Vấn đề bắt đầu khi mình chạy phần mềm vào ngày hôm sau.
- File mình lấy được từ Registry không phải là file hình nền y chang A.bmp nữa. Nó file đã được mình vẽ lên hôm qua temp.bmp. Và hôm nay mình vẽ lên nữa => Failed


Ừ, trước mình làm phần mềm cũng gặp tình trạng đó, lúc đó mình tạm khắc phục như sau:

- Trước khi vẽ, lưu lại 1 bản cho chương trình.
- Sau khi set Wallpaper, lấy file từ C:\...\ABC.jpg, ghi vào đó 1 tag trong metadata là "MyProgramWallpaper".
- Ngày hôm sau, lấy C:\...\ABC.jpg, kiểm tra có tag metadata đó hay không:
  • Nếu có: lấy file đã lưu lại trước khi vẽ để vẽ tiếp.
  • Nếu không: user đã đổi Wallpaper, mình lấy wallpaper mới và thực hiện lại từ đầu.

VuVanHoanh đã viết:Cách anh Đạt nếu xài desktop Win 7, cho nhiều ảnh làm desktop thì có hoạt động được k anh?

Dùng API bắt sự kiện thay đổi Wallpaper của Windows là được.