Toon posts:

[VB6] Huidige filename van winamp ophalen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Uit winamp wil ik de filename ophalen van de audio file die hij staat te spelen. Op de winamp API site http://winamp.com/nsdn heb ik dit gevonden onder de FAQ:

code:
1
2
int index = SendMessage(hwnd_winamp, WM_USER, 0, IPC_GETLISTPOS);
char *name = SendMessage(hwnd_winamp, WM_USER, index, IPC_GETPLAYLISTFILE);


Nu wil ik dit dus in VB invoegen; dit heb ik zo gedaan:
[IPC_GETLISTPOS = 125, IPC_GETPLAYLISTFILE = 211]

code:
1
2
3
4
5
6
7
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Dim curtrack As Integer, buf As String * 256, bufptr As Long
curtrack = SendMessage(hwndWinamp, WM_USER, 0, 125)
bufptr = SendMessage(hwndWinamp, WM_USER, curtrack, 211)
CopyMemory ByVal buf, ByVal bufptr, 255
Print buf


Echter worden alleen maar vreemde tekens geprint, alsof copymemory vanaf de verkeerde pointer kopieerde ofzo. bufptr heeft echter wel een waarde; volgens nullsoft zou dit de pointer moeten zijn. Wat doe ik fout?

PS. het is wel opvallend dat de eerte byte 0 is, maar dat kan ook toeval wezen

[ Voor 6% gewijzigd door Verwijderd op 13-07-2003 19:53 ]


Verwijderd

SendMessage geeft een pointer naar een variabele in het Winampproces, en jij leest geheugen uit het proces van je eigen programma, lijkt me niet echt handig ;)

Dit is hoe ik het heb opgelost:
Visual Basic:
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
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const SYNCHRONIZE As Long = &H100000
Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
Private Const PROCESS_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)
Private Const WM_COMMAND = &H111
Private Const WM_USER = &H400
Private wmpHWND As Long
Private wmpPID As Long
Private wmpPHANDLE As Long


Private Sub Form_Load()
wmpHWND = FindWindow("Winamp v1.x", vbNullString)
GetWindowThreadProcessId wmpHWND, wmpPID
wmpPHANDLE = OpenProcess(PROCESS_ALL_ACCESS, False, wmpPID)
End Sub

Private Sub Form_Unload()
CloseHandle wmpPHANDLE
End Sub


Public Function getSongTitle(songNumber As Integer) As String
'haal de titel van het nr songNumber op

Dim stringStartAddress As Long
Dim char As Byte

stringStartAddress = SendMessage(wmpHWND, WM_USER, songNumber, ByVal 212)
' deze functie geeft een pointer terug

Do  ' dus moeten we direct uit het Winamp geheugen gaan lezen
ReadProcessMemory wmpPHANDLE, stringStartAddress, char, 1, 0
getSongTitle = getSongTitle & Chr(char)
stringStartAddress = stringStartAddress + 1
Loop Until char = 0     ' tot we een null-character tegenkomen

getSongTitle = Left(getSongTitle, Len(getSongTitle) - 1)    ' en daarna moet dat null-character eraf gechopt worden

End Function

Verwijderd

Topicstarter
WOEi, ziet er interessant uit, ik ga em eventjes proberen hoor

Verwijderd

Topicstarter
juist, met curtrack = SendMessage(hwndWinamp, WM_USER, 0, 125) kan ik nu de current track achterhalen. Ik heb wel die 212 veranderd in 211, ik moest nl. de filename hebben

Thnx dude

Verwijderd

Woei, en dat in de eerste reply :*)

Dit stukje code beveel ik trouwens ook aan om te gebruiken als je de titel van het huidige nr wil hebben, want de "- Winamp"-afchop-methode is echt dikke bagger als je je huidige nr laat scrollen in de titelbalk (daar heb ik al met heeeeeeeel veel programma's problemen mee gehad die het dus wel zo deden)

=edit=
Als je nog een stukje code wil wat Winamp 2.x automatisch start als hij nog niet aanstaat (maakt niet uit in welke dir hij is geinstalleerd), moet je me maar ff mailen

[ Voor 27% gewijzigd door Verwijderd op 14-07-2003 01:57 ]