2010-02-15 23 views

Trả lời

14

Bạn có thể thực hiện điều đó bằng P-Invoke. Dưới đây là một số mã sử dụng SetWindowLong (trong User32.dll) để thay đổi đường viền của cửa sổ chính của notepad. (Mã này giả định rằng bạn có một thể hiện của notepad đang chạy.) Bạn có thể thử nghiệm với các kiểu cửa sổ khác nhau để đạt được kết quả mong muốn.

GWL_STYLE dành cho kiểu cửa sổ cơ bản. Bạn có thể đọc về chúng here.
GWL_EXSTYLE dành cho các kiểu cửa sổ mở rộng. Bạn có thể đọc về chúng here.

Imports System.Diagnostics 
Imports System.Runtime.InteropServices 

Module Module1 

    Sub Main() 
     Dim notepad As Process = Process.GetProcessesByName("notepad")(0) 

     Dim GWL_STYLE As Int32 = -16 
     Dim GWL_EXSTYLE As Int32 = -20 

     ' MainWindowHandle happens to be the handle of the window you want for notepad. 

     ' It may not be the handle you want if you try this on a different process. 

     Dim hWnd As IntPtr = notepad.MainWindowHandle 

     ' You can examine the current styles using GetWindowLong. 
     Dim styles As WindowStyles = GetWindowLong(hWnd, GWL_STYLE) 
     Dim exStyles As WindowStyles = GetWindowLong(hWnd, GWL_EXSTYLE) 

     ' WS_VISIBLE must be used for the window to be selectable. 
     Dim newStyles As WindowStyles = WindowStyles.WS_VISIBLE Or WindowStyles.WS_BORDER 

     SetWindowLong(hWnd, GWL_STYLE, newStyles) 

     ' If you want to modify the extended styles, use GWL_EXSTYLE 

     SetWindowLong(hWnd, GWL_EXSTYLE, exStyles) 


    End Sub 

    _ 
Private Function GetWindowLong(_ 
     ByVal hWnd As IntPtr, _ 
     ByVal nIndex As Integer) As Integer 
    End Function 

    _ 
    Private Function SetWindowLong(_ 
    ByVal hWnd As IntPtr, _ 
    ByVal nIndex As Integer, _ 
    ByVal dwNewLong As IntPtr) As Integer 
    End Function 

End Module 

_ 
Public Enum WindowStyles As Long 

    WS_OVERLAPPED = 0 
    WS_POPUP = 2147483648 
    WS_CHILD = 1073741824 
    WS_MINIMIZE = 536870912 
    WS_VISIBLE = 268435456 
    WS_DISABLED = 134217728 
    WS_CLIPSIBLINGS = 67108864 
    WS_CLIPCHILDREN = 33554432 
    WS_MAXIMIZE = 16777216 
    WS_BORDER = 8388608 
    WS_DLGFRAME = 4194304 
    WS_VSCROLL = 2097152 
    WS_HSCROLL = 1048576 
    WS_SYSMENU = 524288 
    WS_THICKFRAME = 262144 
    WS_GROUP = 131072 
    WS_TABSTOP = 65536 

    WS_MINIMIZEBOX = 131072 
    WS_MAXIMIZEBOX = 65536 

    WS_CAPTION = WS_BORDER Or WS_DLGFRAME 
    WS_TILED = WS_OVERLAPPED 
    WS_ICONIC = WS_MINIMIZE 
    WS_SIZEBOX = WS_THICKFRAME 
    WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW 

    WS_OVERLAPPEDWINDOW = WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or _ 
       WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX 
    WS_POPUPWINDOW = WS_POPUP Or WS_BORDER Or WS_SYSMENU 
    WS_CHILDWINDOW = WS_CHILD 

    WS_EX_DLGMODALFRAME = 1 
    WS_EX_NOPARENTNOTIFY = 4 
    WS_EX_TOPMOST = 8 
    WS_EX_ACCEPTFILES = 16 
    WS_EX_TRANSPARENT = 32 

    '#If (WINVER >= 400) Then 
    WS_EX_MDICHILD = 64 
    WS_EX_TOOLWINDOW = 128 
    WS_EX_WINDOWEDGE = 256 
    WS_EX_CLIENTEDGE = 512 
    WS_EX_CONTEXTHELP = 1024 

    WS_EX_RIGHT = 4096 
    WS_EX_LEFT = 0 
    WS_EX_RTLREADING = 8192 
    WS_EX_LTRREADING = 0 
    WS_EX_LEFTSCROLLBAR = 16384 
    WS_EX_RIGHTSCROLLBAR = 0 

    WS_EX_CONTROLPARENT = 65536 
    WS_EX_STATICEDGE = 131072 
    WS_EX_APPWINDOW = 262144 

    WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE 
    WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST 
    '#End If 

    '#If (WIN32WINNT >= 500) Then 
    WS_EX_LAYERED = 524288 
    '#End If 

    '#If (WINVER >= 500) Then 
    WS_EX_NOINHERITLAYOUT = 1048576 ' Disable inheritence of mirroring by children 
    WS_EX_LAYOUTRTL = 4194304 ' Right to left mirroring 
    '#End If 

    '#If (WIN32WINNT >= 500) Then 
    WS_EX_COMPOSITED = 33554432 
    WS_EX_NOACTIVATE = 67108864 
    '#End If 

End Enum 

Giải thích về mã

Tôi không chắc chắn có bao nhiêu kinh nghiệm mà bạn có trong việc phát triển các ứng dụng GUI, vì vậy tôi sẽ cung cấp cho một chút nền tảng về cách thức một cửa sổ hoạt động. Một cửa sổ có một số nhận dạng duy nhất được gọi là một tay cầm. Cũng liên kết với cửa sổ là một thủ tục cửa sổ, xử lý tin nhắn (số nguyên xác định các sự kiện và lệnh) cho cửa sổ đó. Khi một cửa sổ được tạo ra, bạn chỉ định kiểu bạn muốn cửa sổ có, vv Có rất nhiều phức tạp hơn cho các ứng dụng windows, nhưng để tránh bị sa lầy trong các chi tiết chúng ta sẽ di chuyển. Các Winforms tách chúng ta khỏi phải tương tác với Windows API và xử lý các thông điệp trực tiếp (phần lớn) và làm cho nó rất dễ dàng để tạo ra các ứng dụng GUI chức năng. Có nhiều quyền lực hơn dưới mui xe trong API Windows mà hầu hết các nhà phát triển .NET thường không cần phải lo lắng.

Giờ với nền tảng đó, mã sẽ dễ hiểu hơn một chút.

Trước hết, chúng ta cần có quy trình đầu tiên có tên là "notepad".

Dim notepad As Process = Process.GetProcessesByName("notepad")(0) 

Sau đó, chúng tôi xác định hai số nguyên GWL_STYLEGWL_EXSTYLE. Hai số nguyên này sẽ có ý nghĩa cụ thể trong ngữ cảnh của hàm SetWindowLong. Giá trị của chúng (và giá trị của nhiều hằng số khác) có thể được tìm thấy trong Winuser.h và phần còn lại của các tệp tiêu đề trong Windows SDK.

Dim GWL_STYLE As Int32 = -16 
Dim GWL_EXSTYLE As Int32 = -20 

Tiếp theo, chúng tôi có được tay cầm của cửa sổ chính của notepad.

Dim hWnd As IntPtr = notepad.MainWindowHandle 

Sau đó, chúng tôi gặp phải chức năng GetWindowLong. Từ MSDN:

Hàm GetWindowLong truy xuất thông tin về cửa sổ được chỉ định.

GetWindowLong xử lý cửa sổ và giá trị cho biết thông tin nào cần truy xuất và trả về thông tin được chỉ định.

Dim styles As WindowStyles = GetWindowLong(hWnd, GWL_STYLE) 
Dim exStyles As WindowStyles = GetWindowLong(hWnd, GWL_EXSTYLE) 

Chúng được bao gồm để bạn có thể xem kiểu nào được áp dụng cho cửa sổ, vì vậy bạn có thể xác định kiểu sẽ bỏ đi.

Tiếp theo, chúng tôi xác định phong cách chúng tôi muốn áp dụng cho cửa sổ. Bạn có thể đọc về các phong cách khác nhau và ý nghĩa của chúng here.

Dim newStyles As WindowStyles = WindowStyles.WS_VISIBLE Or WindowStyles.WS_BORDER 

Sau đó, chúng tôi áp dụng các kiểu đó cho cửa sổ bằng cách sử dụng SetWindowLong. Từ MSDN:

Hàm SetWindowLong thay đổi thuộc tính của cửa sổ được chỉ định.

SetWindowLong xử lý cửa sổ, giá trị cho biết thuộc tính cần thay đổi, giá trị mới của thuộc tính và thay đổi thuộc tính.

SetWindowLong(hWnd, GWL_STYLE, newStyles) 

Về cơ bản, mã đó là gì. Để tránh sự lặp lại, tôi sẽ không vượt qua GWL_EXSTYLE vì nó được sử dụng chính xác giống như GWL_STYLE. Phần còn lại của mã chỉ là hậu cần để cho phép chúng tôi sử dụng SetWindowLongGetWindowLong.

+0

ok Tôi không biết mã có nghĩa là gì nếu bạn có thể đi từng dòng qua nó, nhưng nó hoạt động nên tôi đã chấp nhận nó như là câu trả lời –

+0

@ Jonathan: Tôi vừa chỉnh sửa và giải thích mã. –

+0

Cảm ơn bạn rất nhiều! Một điều tôi không hiểu tại sao NewStyle được đặt thành WS_Visible * OR * WS_Border? tại sao nó hay? –

Các vấn đề liên quan