Avatar billede thesurfer Nybegynder
18. maj 2004 - 23:41 Der er 18 kommentarer og
1 løsning

Fjern/slet navngiven enhed fra Enhedshåndtering

Den korte:
Jeg søger kode (eller link til kode) som kan fjerne/slette en navngiven enhed fra Enhedshåndtering (skal virke i Windows 98 (SE) + XP).


Den lange:
Jeg har en Acer Aspire 1304 LC (med en 15.1" skærm). Max opløsning er 1024x768 (ved højere opløsning, scrolles skærmen). Ved at sætte en ekstern skærm (Hyundai DeluxScan 17B+, 17") til, kan jeg komme op på en højere opløsning.

Hvis den eksterne skærm er installeret (findes) i Enhedshåndtering, er opløsningen begrænset til 1024x768. Der står at der er installeret 2 skærme:
- bærbarens skærm
- "HL et eller andet" (ekstern skærm)

Jeg har fundet ud af, at hvis jeg fjerner/sletter "HL..." fra Enhedshåndtering, kan jeg komme op på 1280x1024 (skærmen kan ikke klare 1600x1200).


Jeg søger kode (eller link til kode) som kan fjerne/slette en navngiven enhed fra Enhedshåndtering (skal virke i Windows 98 (SE) + XP).


/theSurfer.
Avatar billede thesurfer Nybegynder
22. maj 2004 - 19:55 #1
Kan I overhovedet se dette spm..? :-)
Avatar billede sjh Nybegynder
27. maj 2004 - 21:18 #2
Ja jeg kan godt se spm.. ;)

fjerne fra enhedshåndtering.. kan du ikke bare skifte opløsning??
Avatar billede thesurfer Nybegynder
28. maj 2004 - 16:27 #3
Nope, den tillader max 1024x768 (via skrivebord > egenskaber > instillinger), når skærmen findes i enhedshåndtering..

Jeg har dog ikke prøvet, at skifte opløsning via vb kode.. måske skulle jeg prøve det..
Avatar billede thesurfer Nybegynder
28. maj 2004 - 17:31 #4
hmm.. har ikke noget kode, der skifter opløsning, uden at skulle genstarte..

Jeg prøvede med ResChange: http://www.12noon.com/reschange.htm
Det gik heller ikke.. den kunne kun skifte, hvis enheden var slettet.. selv med reschanges "-force" parameter..

Kan du ikke lave noget kode, kompile den, og oploade exe file?
Jeg har ikke VB installeret pt..
Avatar billede thesurfer Nybegynder
28. maj 2004 - 19:57 #6
Jeg kan se, at den kode også spørger om man vil genstarte:
intAns = MsgBox("You must restart your computer to apply these changes." & _

Jeg tror faktisk, at det er samme kode, som jeg har nu..

Jeg har oploadet den kode jeg har: http://frip.dk/thesurfer/e/myq/499996/499996.zip

Det er et gammelt program, jeg engang arbejdede på..
Avatar billede sjh Nybegynder
29. maj 2004 - 10:38 #7
Ja dit program spørg.. men det gør den kode som jeg linker til ikke hos mig..

Hvis man har sat:

"Egenskaber for skærm" -> "Indstillinger" -> "Avanceret" -> "* Anvend de nye skærmindstillinger uden at genstarte"
Avatar billede thesurfer Nybegynder
29. maj 2004 - 13:03 #8
Underligt.. Jeg har "Anvend de nye" slået til..

Kan du ikke kompile koden du linker til, og oploade exe filen?
Formen skal bare have en listbox (indholder kombinationerne),og en "change"-knap..

En anden god ting, ville være, hvis du kunne lave den, så den accepterede nogle parametere.. f.eks:

kommandolinie: program.exe 1280x1024x32

som er en opløsning på 1280x1024, med 32bit farver


Men jeg tror, at jeg bliver nød til at slette enheden først.. ellers vil den vist nok sige, noget med "out of sync - 80 MHz" (eller noget i den stil), og flimrer..

Af en eller anden grund, kan den eksterne skærm, ikke lide opløsningen 1024x768 :-)
Den begynder tit at hyle, skarpt men lavt.. og det er irriterende..
Avatar billede sjh Nybegynder
29. maj 2004 - 13:08 #9
kommandolinie: program.exe 1280x1024x32.. vil altså kun virke i windows og IKKE i dos
Avatar billede thesurfer Nybegynder
29. maj 2004 - 13:11 #10
Jeg har også tænkt mig, at putte en genvej (med kommandolinien) i start menuen (eller regdb).. når windows starter op, skiftes opløsningen..
Avatar billede sjh Nybegynder
29. maj 2004 - 13:13 #11
du skal bare ændre det her:

ChangeRes 640, 480, GetDeviceCaps(nDC, BITSPIXEL)
Call ChangeRes(1280, 1024, 32)
Avatar billede thesurfer Nybegynder
29. maj 2004 - 13:14 #12
ahh :-)
med dit link? -- vidste jeg da godt ;-)

Jeg må ha' installeret vb på et eller andet tidspunkt, og prøvet det af..

-- men ingen forslag, til sletning af enhed fra enhedshåndtering?
Avatar billede sjh Nybegynder
29. maj 2004 - 13:16 #13
Næ ikke lige nu :)
Avatar billede thesurfer Nybegynder
29. maj 2004 - 14:39 #14
Koden på dit link virker fint, hvis man sletter enheden fra Enhedshåndteringen.. ellers siger den "Mode not supported"..

Så jeg bliver nød til at slette enheden først..

Men der er points til dig for linket.. håber at du kan finde på en eller anden måde, at slette enheden.. :-)
Avatar billede thesurfer Nybegynder
29. maj 2004 - 16:53 #15
sjh> Smid et svar :-)


Så er projektet midlertidigt færdigt (virker i XP, skal teste og rette med Windows 98 SE).. jeg kunne ikke finde noget kode, der automatisk slettede en enhed..
Så jeg brugte SendKeys.. denne kode er vist ikke 100% sikker, da der kan komme fejl, og den måske (tror det dog ikke) sletter en anden enhed, end den den skal :-)

Her er ideen:

- "System Properties" > "Hardware"-fanen poppes up via kode, tak til: http://www.vbexplorer.com/VBExplorer/shellcpl.htm

- Der tabbes ned til "Device Manager"-knappen, og der sendes et " " (space), der så åbner "Device Manager"

- "System Properties" lukkes ved at tabbe ned til Cancel, og space sendes

-- Da det tager tid, at udfører handlingerne, bruge jeg en timer, med et interval på XXXXXXX

- Pos = 1 (pos = position): skal "Monitors" markeres, og derefter åbnes

- Pos = 2: "HL-7770A" (enhedsnavnet på min eksterne monitor) markeres, og "DEL" sendes, hvorefter space bekræfter sletningen

- Pos = 3: Lukning af "Device Manager", man kan ikke klikke Cancel/Escape, og ALT+F4-SendKeys-kombinationen virker vist ikke altid.. derfor sendes ALT+F og derefter X
Herefter sættes "Pos" til 0

- Hver gang timer-koden udføres, checkes om pos = 0.. hvis den er det, disables timeren, og skift-opløsning-koden kaldes:
Call ChangeRes(1280, 1024, 32) (opløsning på 1280x1024, med 32 bit farver)



Som det er nu, aktiveres koden via en knap der hedder "cmdDM"..


-------------------- koden --------------------

Option Explicit
Dim pos As Integer

Const WM_DISPLAYCHANGE = &H7E
Const HWND_BROADCAST = &HFFFF&
Const EWX_LOGOFF = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Const CCDEVICENAME = 32
Const CCFORMNAME = 32
Const DM_BITSPERPEL = &H40000
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const CDS_UPDATEREGISTRY = &H1
Const CDS_TEST = &H4
Const DISP_CHANGE_SUCCESSFUL = 0
Const DISP_CHANGE_RESTART = 1
Const BITSPIXEL = 12
Private Type DEVMODE
    dmDeviceName As String * CCDEVICENAME
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCFORMNAME
    dmUnusedPadding As Integer
    dmBitsPerPel As Integer
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
End Type
Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, ByVal lpInitData As Any) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) 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
Dim OldX As Long, OldY As Long, nDC As Long

Private Sub cmdDM_Click()
Shell "rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2" ' System Properties, "Hardware"-tab
AppActivate "System Properties", False ' focus on System Properties
' "Add Hardware Wizard"-button is selected by default

SendKeys vbTab ' "Driver signing"-button selected
SendKeys vbTab ' "Device Manager"-button selected
SendKeys " " ' space = open "Device Manager"

' close System Properties:
SendKeys vbTab '
SendKeys vbTab '
SendKeys vbTab '
SendKeys " " ' "Cancel"-button selected, space = close "System Properties"

pos = 1
tmr.Enabled = True
End Sub

Private Sub tmr_Timer()
Select Case pos
Case 1
    SendKeys vbTab
    SendKeys "Monitors"
    SendKeys "{RIGHT}"
    pos = 2
   
Case 2
    ' "Monitors" is selected.. pressing "DEL" does nothing
    SendKeys "HL-7770A"
    SendKeys "{DEL}"
    SendKeys " " ' space = OK to "delete unit HL-7770A", if it exists
    tmr.Interval = 3000
    pos = 3
   
Case 3
    SendKeys "%{F}" ' File menu
    SendKeys "X" ' eXit option in File menu
    pos = 0
End Select

If pos = 0 Then
    tmr.Enabled = False
    Call ChangeRes(1280, 1024, 32)
End If
End Sub

Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim nDC As Long
    'retrieve the screen's resolution
    OldX = Screen.Width / Screen.TwipsPerPixelX
    OldY = Screen.Height / Screen.TwipsPerPixelY
    'Create a device context, compatible with the screen
    nDC = CreateDC("DISPLAY", vbNullString, vbNullString, ByVal 0&)
End Sub

Sub ChangeRes(X As Long, Y As Long, Bits As Long)
    Dim DevM As DEVMODE, ScInfo As Long, erg As Long, an As VbMsgBoxResult
    'Get the info into DevM
    erg = EnumDisplaySettings(0&, 0&, DevM)
    'This is what we're going to change
    DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL
    DevM.dmPelsWidth = X 'ScreenWidth
    DevM.dmPelsHeight = Y 'ScreenHeight
    DevM.dmBitsPerPel = Bits '(can be 8, 16, 24, 32 or even 4)
    'Now change the display and check if possible
    erg = ChangeDisplaySettings(DevM, CDS_TEST)
    'Check if succesfull
    Select Case erg&
        Case DISP_CHANGE_RESTART
            an = MsgBox("You've to reboot", vbYesNo + vbSystemModal, "Info")
            If an = vbYes Then
                erg& = ExitWindowsEx(EWX_REBOOT, 0&)
            End If
        Case DISP_CHANGE_SUCCESSFUL
            erg = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)
            ScInfo = Y * 2 ^ 16 + X
            'Notify all the windows of the screen resolution change
            SendMessage HWND_BROADCAST, WM_DISPLAYCHANGE, ByVal Bits, ByVal ScInfo
            'MsgBox "Everything's ok", vbOKOnly + vbSystemModal, "It worked!"
        Case Else
            MsgBox "Mode not supported", vbOKOnly + vbSystemModal, "Error"
    End Select
End Sub
Avatar billede thesurfer Nybegynder
29. maj 2004 - 16:59 #16
rettelse:

Da det tager tid, at udfører handlingerne, bruge jeg en timer, med et interval på XXXXXXX

Hvor XXXXXXX er tiden i ms. Denne skal være mindre, end tiden for "gentagelsesindtastning" (jeg tror ikke at der er noget der hedder det..)
Hvis man venter forlænge, vil markeringen starte om, og man på en anden "mappe", end "Monitors"..

Jeg mener at 500 ms er nok.. men tester lige..
Avatar billede thesurfer Nybegynder
29. maj 2004 - 17:11 #17
Jeg tror at den er ok med ms på 700 (måske også 500 ms).

Anyways.. forløbig bliver det sådan, at jeg dobbelklikker på en genvej, som starter programmet.. så kan jeg selv skifte..

Man kunne også udvikle det sådan, at man kører det med:

kommandolinie:
program.exe 9x (bruger 9x version af "System Properties")
program.exe xp (bruger 9x version af "System Properties")

Jeg har også overvejet, at lave en ini fil, hvor indholdet ligner:

[9x_US]
title1=System Properties
folder_name=Monitors
device_name=HL-7770A
osv..

[9x_DK]
popup_code=rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1
title2=Egenskaber for et eller andet
folder_name=Monitors
device_name=HL-7770A
osv..

[XP_US]
popup_code=..............
title1=System Properties
folder_name=Monitors
device_name=HL-7770A
osv..

[XP_DK]
title2=Egenskaber for et eller andet
folder_name=Monitors
device_name=HL-7770A
osv..

Man kan så selv indsætte egne værdier efter formatet..
Avatar billede sjh Nybegynder
29. maj 2004 - 22:37 #18
:-) okææ (y)
Avatar billede thesurfer Nybegynder
30. maj 2004 - 00:27 #19
Det virker ikke 100% endnu, men jeg må kigge på det senere :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester