Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Κλειδωμα του μενου εναρξης

Îåêßíçóå áðü ôï ìÝëïò dimcal. Τελευταία δημοσίευση από το μέλος dimcal στις 14-06-2009, 12:39. Υπάρχουν 32 απαντήσεις.
Σελίδα 2 από 3 (33 εγγραφές)   < 1 2 3 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  11-06-2009, 22:05 51578 σε απάντηση της 51576

    Απ: Κλειδωμα του μενου εναρξης

    euxaristw poli !
  •  12-06-2009, 07:10 51579 σε απάντηση της 51578

    Απ: Κλειδωμα του μενου εναρξης

    Χμμ,φαντάζομαι αυτό το post θα γίνει αρκετά μεγάλο.Θα σου δείξω παράλληλα πώς θα κρύψεις taskbar και το start button και το πώς θα απερνεγοποιήσεις τα Windows buttons και τον συνδυασμό Ctrl+Esc  με keyboard hook.Επαναλαμβάνω επί του πρώτου ότι αν απλά θες fullscreen application υπάρχουν μακράν καλύτεροι τρόποι.

    Στην κλάση της φόρμας σου πρόσθεσε την δήλωση:

    Imports System.Runtime.InteropServices

    Χρειάζεσαι την εξής δομή για τις πληροφορίες από το πληκτρολόγιο:

    [StructLayout(LayoutKind.Sequential)] 
    public struct KBDLLHOOKSTRUCT 
    {
    public uint vkCode; 
    public uint scanCode; 
    public uint flags; 
    public uint time; 
    public UIntPtr dwExtraInfo;
    } 

    Επιπλέον θα χρειαστεί να εισάγεις τις λίγες Hmm παρακάτω unmanaged Windows συναρτήσεις:

    <DllImport("user32.dll")> _ 
    Protected Shared Function FindWindowA(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    End Function
    
    <DllImport("user32.dll")> _ 
    Protected Shared Function GetWindow(ByVal hWnd As IntPtr, ByVal wCmd As UInteger) As IntPtr
    End Function
    
    <DllImport("user32.dll")> _ 
    Protected Shared Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As Integer) As Integer
    End Function
    
    <DllImport("user32.dll")> _ 
    Protected Shared Function SetWindowsHookEx(ByVal code As Integer, ByVal func As HookProc, ByVal hInstance As IntPtr, ByVal threadID As Integer) As IntPtr
    End Function
    
    <DllImport("user32.dll")> _ 
    Protected Shared Function UnhookWindowsHookEx(ByVal hhook As IntPtr) As Integer
    End Function
    
    <DllImport("user32.dll")> _ 
    Protected Shared Function CallNextHookEx(ByVal hhook As IntPtr, ByVal code As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
    End Function
    
    <DllImport("user32.dll", CharSet := CharSet.Auto, ExactSpelling := True)> _ 
    Protected Shared Function GetAsyncKeyState(ByVal vKey As Integer) As Short
    End Function
    Και μια delegate που χρειάζεται να περάσουμε στην SetWindowsHookEx:
    Public Delegate Function HookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer

    Τέλος χρειάζεσαι και κάποια μέλη:

    Private hTaskBar As IntPtr
    'Handle για το taskbar 
    Private hStartButton As IntPtr
    'Handle για το start button 
    Shared hhk As IntPtr = IntPtr.Zero
    'Handle για το keyboard hook 
    Private KeyboardHoocProc As HookProc
    'αυτήν θα περάσουμε στο SetWindowsHookEx 

    Είμαστε έτοιμοι λοιπόν να δούμε τον κώδικα που κάνει τη δουλειά.Για οικονομία χώρου απέφυγα να δηλώσω ορισμένες μεταβλητές που θα έκαναν πιο κατανοητό τον κώδικα.Στο event Load της φόρμας σου πρόσθεσε τα εξής:

    hTaskBar = FindWindowA("Shell_TrayWnd", "")
    'βρίσκουμε το handle για το taskbar 
    hStartButton = GetWindow(hTaskBar, 3)
    'και εκμεταλλευόμαστε το ότι το αμέσως προηγούμενο παράθυρο είναι το start button 
    ShowWindow(hTaskBar, 0)
    'και κρύβουμε και τα δύο 
    ShowWindow(hStartButton, 0)
    
    KeyboardHoocProc = New HookProc(KeyboardHookHandler)
    'Αναθέτουμε τη συνάρτηση που θα εκτελεί το hook 
    hhk = SetWindowsHookEx(13, KeyboardHoocProc, IntPtr.Zero, 0)
    'και τον δημιουργούμε

    Και τα εξής στο Closed event της φόρμας:

    ShowWindow(hTaskBar, 5)
    'Ξαναεμφανίζουμε τα παράθυρα 
    ShowWindow(hStartButton, 5)
    
    UnhookWindowsHookEx(hhk)
    'Και απεγκαθιστούμε το hook
     

    Η παρακάτω συνάρτηση αναλαμβάνει να κάνει disable τα Windows buttons και τον συνδυασμό Ctrl+Esc:

    Public Shared Function KeyboardHookHandler(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
        If nCode < 0 Then
            Return CallNextHookEx(hhk, nCode, wParam, lParam)
        End If
        'οι πληροφορίες βρίσκονται στην lParam,τις εξάγουμε με Marshaling 
        Dim kb As KBDLLHOOKSTRUCT = DirectCast(Marshal.PtrToStructure(lParam, GetType(KBDLLHOOKSTRUCT)), KBDLLHOOKSTRUCT)
        Select Case kb.vkCode
            Case &H5b
                'μπλοκάρουμε το αριστερό windows key 
                Return 1
            Case &H5c
                'το ίδιο για το δεξιό 
                Return 1
            Case &H1b
                'πατήθηκε το escape key 
                'αν την ίδια ώρα είναι πατημένο και το αριστερό ή δεξί Ctrl,μπλοκάρουμε τον συνδυασμό 
                If (GetAsyncKeyState(&Ha2) And &H8000) <> 0 OrElse (GetAsyncKeyState(&Ha3) And &H8000) <> 0 Then
                    Return 1
                Else
                    Exit Select
                End If
        End Select
        Return CallNextHookEx(hhk, nCode, wParam, lParam)
    End Function

    Αν γλυτώσω το ban από τους moderators για το post-γίγας Stick out tongue ορίστε η λύση,που αν και όχι η καλύτερη,δουλεύει και είναι και η πιο απλή στην υλοποίηση.

  •  12-06-2009, 08:19 51580 σε απάντηση της 51579

    Απ: Κλειδωμα του μενου εναρξης

    E, όχι και ban... Αλλά μιας και έκανες τόσο κόπο να γράψεις όλα αυτά, κάνε και λίγο παραπάνω να περάσεις τον κώδικα ως code snippets για να διαβάζεται πιο εύκολα.


    Vir prudens non contra ventum mingit
  •  12-06-2009, 08:56 51581 σε απάντηση της 51580

    Απ: Κλειδωμα του μενου εναρξης

    Έγινε Wink
  •  12-06-2009, 10:40 51587 σε απάντηση της 51581

    Απ: Κλειδωμα του μενου εναρξης

    fullscreen εφαρμογη θελω να φτιαξω αλλα πρεπει να μη επιτρεπει στο χρηστη να ανοιγει το μενου εναρξη ... Την εχω φτιαξει τη φορμα να παιρνει τις διαστασεις της οθονης αλλα οταν πατησεις Ctrl+Esc η το κουμπι με τη σημαια τοτε η taskbar εμφανιζεται πανω απ τη φορμα....
  •  12-06-2009, 10:45 51588 σε απάντηση της 51587

    Απ: Κλειδωμα του μενου εναρξης

    α και την εφαρμογη τη γραφω σε vb 2008 οπως ειπα ,εχω γνωσεις C++ αλλα δεν εχω ασχοληθει με την Visual C++ η την Visual C# ποτε ...
  •  12-06-2009, 17:02 51598 σε απάντηση της 51587

    Απ: Κλειδωμα του μενου εναρξης

    dimcal:
    fullscreen εφαρμογη θελω να φτιαξω αλλα πρεπει να μη επιτρεπει στο χρηστη να ανοιγει το μενου εναρξη ... Την εχω φτιαξει τη φορμα να παιρνει τις διαστασεις της οθονης αλλα οταν πατησεις Ctrl+Esc η το κουμπι με τη σημαια τοτε η taskbar εμφανιζεται πανω απ τη φορμα....

    Οπότε ξέχνα αυτό με το κρύψιμο της taskbar.Βάλε τις εξής ιδιότητες στη φόρμα σου

    Me.Bounds = Screen.PrimaryScreen.Bounds
    Me.TopMost = True
    Me.FormBorderStyle = FormBorderStyle.None
    και σε συνεργασία με την ChangeDisplaySettings του Windows API με flag CDS_FULLSCREEN θα έχεις μια πραγματικά fullscreen εφαρμογή.
    dimcal:
    α και την εφαρμογη τη γραφω σε vb 2008 οπως ειπα ,εχω γνωσεις C++ αλλα δεν εχω ασχοληθει με την Visual C++ η την Visual C# ποτε ....
    Έγινε.Παρότι όμως δεν το θεωρώ ιδιαίτερα σημαντικό να γνωρίζεις να γράφεις πάνω από μία γλώσσα,είναι πολύ σημαντικό να γνωρίζεις να διαβάζεις όσες περισσότερες μπορείς,διαφορετικά χάνεις εξαιρετικά μεγάλο ποσοστό του κώδικα που κυκλοφορεί στο internet και μπορεί να σου λύνει τα χέρια αρκετές φορές.
  •  12-06-2009, 19:42 51607 σε απάντηση της 51598

    Απ: Κλειδωμα του μενου εναρξης

    Τις 3 γραμμες κωδικα που μου εδωσες τις εχω ηδη κανει και επιμενει να εμφανιζεται το μενου ... Προφανως αυτο που ζηταω θα γινεται με το API .Επειδη δεν ειμαι πολυ εξοικιωμενος με τα windows API μπορεις να μου πεις με απλα λογια πως θα το χρησιμοποιησω ; ευχαριστω για την υπομονη σου....

  •  12-06-2009, 21:02 51608 σε απάντηση της 51607

    Απ: Κλειδωμα του μενου εναρξης


    Για δες λίγο αυτό,

    http://www.lytebyte.com/2007/06/19/improve-gaming-experience-in-pc-by-disabling-windows-key/

    δεν το έχω δοκιμάσει.... είναι από Googling!!!!

    Νικόλαος Καντζέλης
    BSc, MSc, MCAS, MCPD, MCITP, MCTS,MCP, MCT
    http://www.nksolutions.gr
    http://dotnetstories.wordpress.com
    http://weblogs.asp.net/dotnetstories
    http://forum.dotnetnuke.gr
  •  12-06-2009, 21:27 51610 σε απάντηση της 51607

    Απ: Κλειδωμα του μενου εναρξης

    αν πας και κάνεις αρχικά το taskbar- autohide με το χέρι,

    και μετά τρέξεις αυτό τον κώδικα, που σου είχα ξαναστείλει..... θα εξαφανιστεί το windows start button.

    όμως τα keyboard shortcuts παίζουνε.....

    Option Explicit On
    Imports System.Runtime.InteropServices


    Public Class Form1



        Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
        Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
        Const SWP_HIDEWINDOW = &H80
        Const SWP_SHOWWINDOW = &H40
        Dim taskBar As Integer


        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            taskBar = FindWindow("Shell_traywnd", "")

        End Sub

        Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If Button1.Text = "Hide" Then
                Debug.Write(SetWindowPos(taskBar, 0&, 0&, 0&, 0&, 0&, SWP_HIDEWINDOW))
                Button1.Text = "Show"
            Else
                Debug.Write(SetWindowPos(taskBar, 0&, 0&, 0&, 0&, 0&, SWP_SHOWWINDOW))
                Button1.Text = "Hide"
            End If

        End Sub

    End Class

    Νικόλαος Καντζέλης
    BSc, MSc, MCAS, MCPD, MCITP, MCTS,MCP, MCT
    http://www.nksolutions.gr
    http://dotnetstories.wordpress.com
    http://weblogs.asp.net/dotnetstories
    http://forum.dotnetnuke.gr
  •  12-06-2009, 23:26 51618 σε απάντηση της 51610

    Απ: Κλειδωμα του μενου εναρξης

    Ναι αλλα ακομα και να γινει autohide οταν πατησεις Ctrl+Esc θα εμφανιστει παλι το μενου .Το προβλημα ειναι να μην φαινεται οταν καπιος πατησει αυτο το συνδυασμο...γιατι και τωρα το καλυπτει η φορμα

  •  13-06-2009, 00:14 51619 σε απάντηση της 51618

    Απ: Κλειδωμα του μενου εναρξης

    dimcal:

    Ναι αλλα ακομα και να γινει autohide οταν πατησεις Ctrl+Esc θα εμφανιστει παλι το μενου .Το προβλημα ειναι να μην φαινεται οταν καπιος πατησει αυτο το συνδυασμο...γιατι και τωρα το καλυπτει η φορμα

    Φαντάζομαι δεν μπήκες στον κόπο να διαβάσεις τον κώδικα που σου έγραψα για το keyboard hook,ο οποίος απενεργοποιεί και τα δύο windows keys και τον συνδυασμό Ctrl+Esc και αυτή η ρύθμιση διαρκεί μόνο όσο η φόρμα είναι ανοικτή(που από ότι κατάλαβα αυτό επιθυμείς).Τέσπα,εγώ σου έδωσα μια λύση,αν θες την χρησιμοποιείς.

    Τώρα όσον αφορά το πώς θα κάνεις την εφαρμογή σου fullscreen:όπως είπαμε η φόρμα σου χρειάζεται τις εξής ιδιότητες:

    Me.TopMost = True
    Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None
    Me.Bounds = Screen.PrimaryScreen.Bounds
     
     
    Αυτός ο συνδυασμός δίνει μια φόρμα που καλύπτει όλη την οθόνη(και την taskbar).Μαζί με τον keyboard hook που έγραψα(χωρίς το τμήμα του κώδικα που κρύβει την taskbar) φτάνουν για να 
    καλύψουν τις ανάγκες σου.Όμως δεν είναι πραγματικά fullscreen εφαρμογή και αν σε ενδιαφέρει το πως θα γίνει παρακολούθησε παρακάτω.
     
    Δήλωσε την εξής δομή:
     
    <StructLayout(LayoutKind.Sequential)> _ 
    Public Structure DEVMODE
        Public Const CCHDEVICENAME As Integer = 32
        Public Const CCHFORMNAME As Integer = 32
        
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst := CCHDEVICENAME)> _ 
        Public dmDeviceName As String
        Public dmSpecVersion As Short
        Public dmDriverVersion As Short
        Public dmSize As Short
        Public dmDriverExtra As Short
        Public dmFields As Integer
        
        Public dmOrientation As Short
        Public dmPaperSize As Short
        Public dmPaperLength As Short
        Public dmPaperWidth As Short
        
        Public dmScale As Short
        Public dmCopies As Short
        Public dmDefaultSource As Short
        Public dmPrintQuality As Short
        Public dmColor As Short
        Public dmDuplex As Short
        Public dmYResolution As Short
        Public dmTTOption As Short
        Public dmCollate As Short
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst := CCHFORMNAME)> _ 
        Public dmFormName As String
        Public dmLogPixels As Short
        Public dmBitsPerPel As Integer
        ' Declared wrong in the full framework
        Public dmPelsWidth As Integer
        Public dmPelsHeight As Integer
        Public dmDisplayFlags As Integer
        Public dmDisplayFrequency As Integer
        
        Public dmICMMethod As Integer
        Public dmICMIntent As Integer
        Public dmMediaType As Integer
        Public dmDitherType As Integer
        Public dmReserved1 As Integer
        Public dmReserved2 As Integer
        Public dmPanningWidth As Integer
        Public dmPanningHeight As Integer
        
        Public dmPositionX As Integer
        ' Using a PointL Struct does not work 
        Public dmPositionY As Integer
        
    End Structure
     
     
    Και αντίστοιχα μέσα στη φόρμα σου τις ακόλουθες Win32 συναρτήσεις:
     
    <DllImport("user32.dll")> _ 
    Public Shared Function ChangeDisplaySettings(ByRef devMode As DEVMODE, ByVal flags As UInteger) As Integer
    End Function
    
    <DllImport("user32.dll")> _ 
    Public Shared Function EnumDisplaySettings(ByVal deviceName As String, ByVal modeNum As Integer, ByRef devMode As DEVMODE) As Integer
    End Function
     
     
    Χρειάζεσαι τέλος το εξής μέλος δεδομένων:
     
     
    Private dev As DEVMODE
     
     
    Στο Load event της εφαρμογής σου χρειάζεσαι τον εξής κώδικα:
    dev = New DEVMODE()
    dev.dmDeviceName = New String(New Char(31) {})
    dev.dmFormName = New String(New Char(31) {})
    dev.dmSize = CShort(Marshal.SizeOf(GetType(DEVMODE)))
    
    EnumDisplaySettings(Nothing, -1, dev)
    
    ChangeDisplaySettings(dev, &H4)
     
     
    Και τέλος τον παρακάτω κώδικα στο FormClosed event:
     
    ChangeDisplaySettings(dev, 0)
     
     
    Υ.Γ:Σημείωσα με ευκρίνεια στο προηγούμενο post ποιο κομμάτι του κώδικα αφορά τον hook,ώστε να μη δημιουργηθεί πρόβλημα να τον ξεχωρίσεις.
  •  13-06-2009, 10:00 51623 σε απάντηση της 51619

    Απ: Κλειδωμα του μενου εναρξης

    Ολες τις απαντησεις τις διαβασα και σας ευχαριστω πολυ ολους .... απλα ειπες οτι αν ηθελα μια fullscreen εφαρμογη υπαρχει πιο ευκολος τροπος . Θα δοκιμασω το hook και θα σας γραψω τι εγινε

  •  13-06-2009, 10:20 51624 σε απάντηση της 51619

    Απ: Κλειδωμα του μενου εναρξης

    Υπαρχει ενα προβλημα .Εχεις γραψει την δομη σε Visual C το τελευταιο τυπο της μεταβλητης δεν το βρισκω στη vb....το μετετρεψα ετσι :

    Public Structure KBDLLHOOKSTRUCT

    Public vkCode As UInt16

    Public scanCode As UInt16

    Public flags As UInt16

    Public time As UInt16

    Public dwExtraInfo

    End Structure

     

    και κατι αλλο εκει που γραφεις :

    KeyboardHoocProc = New HookProc(KeyboardHookHandler)

    η KeyboardHookHandler ειναι συναρτηση ,δεν θελει παραμέτρους?

  •  13-06-2009, 17:01 51632 σε απάντηση της 51624

    Απ: Κλειδωμα του μενου εναρξης

    dimcal:

    Υπαρχει ενα προβλημα .Εχεις γραψει την δομη σε Visual C το τελευταιο τυπο της μεταβλητης δεν το βρισκω στη vb....το μετετρεψα ετσι :

    Public Structure KBDLLHOOKSTRUCT

    Public vkCode As UInt16

    Public scanCode As UInt16

    Public flags As UInt16

    Public time As UInt16

    Public dwExtraInfo

    End Structure

    Η dwExtraInfo είναι τύπου System.UIntPtr που,αν και μη CLS-compliant- νομίζω είναι προσβάσιμη και από τη VB.NET.Αν αντιμετωπίζεις προβλήματα πάντως μπορείς να την μετατρέψεις σε IntPtr δίχως καμία επίδραση σε αυτό το project.

    dimcal:

    και κατι αλλο εκει που γραφεις :

    KeyboardHoocProc = New HookProc(KeyboardHookHandler)

    η KeyboardHookHandler ειναι συναρτηση ,δεν θελει παραμέτρους?

    Ναι,παράλειψή μου,έπρεπε να γράφει

    KeyboardHoocProc = New HookProc(AddressOf KeyboardHookHandler)
     
Σελίδα 2 από 3 (33 εγγραφές)   < 1 2 3 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems