Χμμ,φαντάζομαι αυτό το 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;
}
Επιπλέον θα χρειαστεί να εισάγεις τις λίγες
παρακάτω 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-γίγας
ορίστε η λύση,που αν και όχι η καλύτερη,δουλεύει και είναι και η πιο απλή στην υλοποίηση.