Otázky a odpovědi

V této rubrice najdete odpovědi na své otázky, které můžete zasílat na adresu vbtipy@seznam.cz. Pokud nebudeme znát odpověď na nějakou otázku, objeví se v části Otázky bez odpovědi a budete-li znát odpověď vy, můžete nám ji pomocí výše uvedené adresy zaslat, rádi ji zveřejníme.

Otázky a odpovědi

Otázky bez odpovědi

Otázky a odpovědi

  Jak lze zjistit ve Visual Basicu adresu síťové karty počítače, na kterém právě běží aplikace?

Zjistit hardwarovou adresu síťové karty není až tak jednoduché, aby se vlezlo na tuto stránku, proto zkuste tento příklad. API funkcí, která vrací takovou informaci je NetBios.


  Potřeboval bych pomoci s programem, který má detekovat, jestli je spuštěno více oken Internet Exploreru a v případě, že jsou spuštěny 3, aby se jedno ukončilo. A také aby program fungoval hlavně pod Windows NT i 2000 a neměl by jít ukončit.

Jestli je spuštěn nějaký program, můžete zjistit pomocí API funkce GetWindow. Funkce prochází všechna "okna" ve Windows (přesněji ta, která si řeknete, ale vy potřebujete projít všechna) a dává jejich handle (pokud vám nevyhovuje GetWindow, zkuste EnumWindows). Z toho můžete zase pomocí GetWindowText zjistit, jestli je to Internet Explorer a dál už záleží na Vás. Níže uvedený příklad projde všechna "okna" a vypíše jejich název. Jak udělat, aby program nešel ukončit pod NT nevím. Ale podle toho co vím, tak půjde ukončit vždy, vždyť NT jsou serverový OS a ten by se podle mého názoru neměl ptát programu, jestli chce ukončit nebo ne. Ale je to pouze domněnka, nemám s NT moc zkušeností.

Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
  (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long

Private Const GW_HWNDNEXT = 2
Private Const GW_CHILD = 5

Private Sub VypisOkna()
  Dim desktop As Long, hwnd As Long
  Dim title As String, delka As Long

  hwnd = GetWindow(GetDesktopWindow, GW_CHILD)
  Do While hwnd <> 0
    hwnd = GetWindow(hwnd, GW_HWNDNEXT)

    title = String(255, vbNullChar)
    delka = GetWindowText(hwnd, title, 255)
    title = Left(title, delka)

    If delka > 0 Then Debug.Print title
  Loop
End Sub


  Zajímalo by mně, jak se dá ve Visual Basicu zjisit seriové číslo disku, na kterém se nachází můj program.

Seriové číslo disku lze zjistit pouze pomocí API, VB žádnou funkci nemá. API funkce, která vám řekne seriové číslo je GetVolumeInformation.

Private Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" _
   (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, _
    ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, _
    lpMaximumComponentLength As Long, lpFileSystemFlags As Long, _
    ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long

Private Sub ZobrazSN(ByVal disk As String) 'disk - napr. C:\
  Dim sn As Long, nazev As String, i1 As Long, i2 As Long, i3 As String, hw As Long, lw As Long

  nazev = Space(14): i3 = Space(32)
  GetVolumeInformation "C:\", nazev, Len(nazev), sn, i1, i2, i3, Len(i3)

  hw = HiWord(sn) And &HFFFF&
  lw = LoWord(sn) And &HFFFF&
  MsgBox "Seriové číslo disku: " & Format(Hex(hw), "0000") & "-" & Format(Hex(lw), "0000")
End Sub

Private Function HiWord(ByVal dw As Long) As Integer
  If dw And &H80000000 Then
    HiWord = (dw \ 65535) - 1
  Else
    HiWord = dw \ 65535
  End If
End Function

Private Function LoWord(ByVal dw As Long) As Integer
  If dw And &H8000& Then
    LoWord = &H8000 Or (dw And &H7FFF&)
  Else
    LoWord = dw And &HFFFF&
  End If
End Function


  Jakým způsobem lze ve Visual Basicu přehrávat MID soubory. Nechci použít přehrávač integrovaný ve Windows.

Pokud chcete soubory přehrávat jednoduše, použijte prvek z VB, Microsoft Multimedia Control. Umí přehrávat nejen MID, ale i WAV a audio CD. Chcete-li si z hudbou "hrát" více, musíte použít API funkce MCI. Jejich popis by přesahoval možnosti této rubriky, pokud se o tom chcete něco dozvědět, zkuste pro začátek stránku Microsoftu.


Otázky bez odpovědi

  V MSDN je zmienka o použití interfacu k objektom Windows Exploreru na vloženie objektov (Listview, treeview, combo, taskbar atď ) do vlastných aplikácií, ale priložené vzory sú pre C++. Chcem Vás požiadať o nejaké moduly alebo príklady pre použitie týchto objektov, za čo Vám budem veľmi vďačný ! Zaujíma ma hlavne zobrazenie Listview, treeview, combo z exploreru a objekty z taskbaru (tabsysview, systraj objekt, objekt hodín a ponuky Štart pre vytvorenie nového typu taskbaru). Veľmi Vás prosím o pomoc.


  Rád by som získal informácie o API funkciách pre prácu s resources, spôsob ich volania vo VB a informácie potrebné pre správny chod funkcie: loadresource, findresorce, freeresource, updateresource. Chcel by som urobiť malý lokalizátor, a na to sú potrebné tieto funkcie, v angličtine (MSDN) som čosi porozumel, ale neviem ako loadnuté resource zobraziť v Image, txt objekte, a ako ich updatovať do súboru.


  Zkoušel jsem přidat bitmapu do menu pomocí API funkce SetMenuItemBitmaps. V normálním menu to funguje. Jakmile však stejný postup použiji v PopupMenu, obrázek se nezobrazí.