• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

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

Các thủ thuật về truyền thông đa phương tiện, đồ họa

Moderators: tungcan5diop, QUANITGROBEST

User avatar
vo_minhdat2007
Quản trị
Quản trị
Posts: 2227
Joined: Sun 17/07/2005 1:40 am
Has thanked: 13 times
Been thanked: 87 times
Contact:

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

Postby vo_minhdat2007 » Wed 25/08/2010 5:11 pm

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:

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

Dùng API:

[vbnet] <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Public Shared Function SystemParametersInfo(ByVal uAction As UInt32, ByVal uParam As Integer, ByVal lpvParam As String, ByVal fuWinIni As Integer) As Integer
End Function

Public Function GetCurrentDesktopWallpaper() As String
Dim currentWallpaper As New String(ControlChars.NullChar, MAX_PATH)
SystemParametersInfo(SPI_GETDESKWALLPAPER, currentWallpaper.Length, currentWallpaper, 0)
Return currentWallpaper.Substring(0, currentWallpaper.IndexOf(ControlChars.NullChar))
End Function[/vbnet]

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

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

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:

[vbnet] 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
Private Const SPI_SETDESKWALLPAPER = 20
Private Const SPIF_UPDATEINIFILE = &H1[/vbnet]

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

[vbnet] 'Lưu lại
bm.Save("C:\Temp.bmp")
'Đặt làm hình nền mới
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\Temp.bmp", SPIF_UPDATEINIFILE)
[/vbnet]

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

Image
Image



volcano2409
Thành viên năng nổ
Thành viên năng nổ
Posts: 92
Joined: Tue 21/04/2009 5:24 pm

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

Postby volcano2409 » Wed 25/08/2010 6:10 pm

Nhưng mà làm sao có thể chèn một tấm hình nào đó từ form vào dc :-?

User avatar
TheDark
Guru
Guru
Posts: 188
Joined: Thu 04/11/2010 3:56 pm
Location: Mang Thít - Vĩnh Long
Has thanked: 6 times
Been thanked: 33 times

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

Postby TheDark » Fri 20/01/2012 4:54 pm

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

User avatar
VuVanHoanh
Thành viên danh dự
Thành viên danh dự
Posts: 1259
Joined: Thu 03/06/2010 9:23 pm
Location: Kim Sơn - Đông Triều - Quảng Ninh
Has thanked: 22 times
Been thanked: 138 times
Contact:

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

Postby VuVanHoanh » Sun 22/01/2012 7:55 am

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?
Since 2008...
One love! :x

User avatar
vo_minhdat2007
Quản trị
Quản trị
Posts: 2227
Joined: Sun 17/07/2005 1:40 am
Has thanked: 13 times
Been thanked: 87 times
Contact:

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

Postby vo_minhdat2007 » Sun 22/01/2012 8:37 am

TheDark wrote: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 wrote: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.


Return to “[.NET] Âm thanh và Đồ họa”

Who is online

Users browsing this forum: No registered users and 1 guest