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.
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.
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φ.