Ik ben bezig met een programmaatje waarmee je de positie van alle sohortcuts op je desktop op kan slaan en die shortcuts bij wijzigingen op je desktop ook weer op de juiste locatie kan terugzetten.
Nu had ik dus ergens een stuk code gevonden die de locatie en tekst van alle sortcuts op je desktop kan achterhalen. Het gaat om de volgende code: (MSDN: How can i get desktop's icon's information ?)
Met deze code kan ik wel de locatie van de shortcuts verkrijgen maar de tekst van de shortcut verkrijgen lukt niet. De tekst wordt hier verkregen (zie ook de code hierboven):
Tijdens het debuggen zie ik dat de string: vText de volgende waarde heeft:
/0/0/0/0/0/0/0/0 enz.
De juiste tekst wordt dus niet verkregen en er gaat dus iets fout bij de functie: Encoding.Unicode.GetString(.......
Echter weet ik niet precies wat er fout gaat. Iemand een idee?
En weet iemand ook hoe je de locatie (folder path) van een 'desktop shortcut' kan achterhalen?
Nu had ik dus ergens een stuk code gevonden die de locatie en tekst van alle sortcuts op je desktop kan achterhalen. Het gaat om de volgende code: (MSDN: How can i get desktop's icon's information ?)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
| private void button1_Click(object sender, EventArgs e) { // get the handle of the desktop listview IntPtr vHandle = FindWindow("Progman", "Program Manager"); vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SHELLDLL_DefView", null); vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SysListView32", "FolderView"); //Get total count of the icons on the desktop int vItemCount = SendMessage(vHandle, LVM_GETITEMCOUNT, 0, 0); this.label1.Text = vItemCount.ToString(); uint vProcessId; GetWindowThreadProcessId(vHandle, out vProcessId); IntPtr vProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, false, vProcessId); IntPtr vPointer = VirtualAllocEx(vProcess, IntPtr.Zero, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); try { for (int j = 0; j < vItemCount; j++) { byte[] vBuffer = new byte[256]; LVITEM[] vItem = new LVITEM[1]; vItem[0].mask = LVIF_TEXT; vItem[0].iItem = j; vItem[0].iSubItem = 0; vItem[0].cchTextMax = vBuffer.Length; vItem[0].pszText = (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(LVITEM))); uint vNumberOfBytesRead = 0; WriteProcessMemory(vProcess, vPointer, Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0), Marshal.SizeOf(typeof(LVITEM)), ref vNumberOfBytesRead); SendMessage(vHandle, LVM_GETITEMW, j, vPointer.ToInt32()); ReadProcessMemory(vProcess, (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(LVITEM))), Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0), vBuffer.Length, ref vNumberOfBytesRead); string vText = Encoding.Unicode.GetString(vBuffer, 0, (int)vNumberOfBytesRead); string IconName = vText; //Get icon location SendMessage(vHandle, LVM_GETITEMPOSITION, j, vPointer.ToInt32()); Point[] vPoint = new Point[1]; ReadProcessMemory(vProcess, vPointer, Marshal.UnsafeAddrOfPinnedArrayElement(vPoint, 0), Marshal.SizeOf(typeof(Point)), ref vNumberOfBytesRead); string IconLocation = vPoint[0].ToString(); //Insert an item into the ListView this.listView1.Items.Add(new ListViewItem(new string[]{IconName,IconLocation})); } } finally { VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE); CloseHandle(vProcess); } this.listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); } } |
Met deze code kan ik wel de locatie van de shortcuts verkrijgen maar de tekst van de shortcut verkrijgen lukt niet. De tekst wordt hier verkregen (zie ook de code hierboven):
code:
1
2
3
| string vText = Encoding.Unicode.GetString(vBuffer, 0, (int)vNumberOfBytesRead); string IconName = vText; |
Tijdens het debuggen zie ik dat de string: vText de volgende waarde heeft:
/0/0/0/0/0/0/0/0 enz.
De juiste tekst wordt dus niet verkregen en er gaat dus iets fout bij de functie: Encoding.Unicode.GetString(.......
Echter weet ik niet precies wat er fout gaat. Iemand een idee?
En weet iemand ook hoe je de locatie (folder path) van een 'desktop shortcut' kan achterhalen?