ช่วยปรับแก้โค้ดซ่อนปุ่ม Access หน่อยค่ะ
กระทู้เก่าบอร์ด อ.Yeadram

 3,623   14
URL.หัวข้อ / URL
ช่วยปรับแก้โค้ดซ่อนปุ่ม Access หน่อยค่ะ

จากโค้ดที่อาจารย์สันติสุขแนะนำ สำหรับใช้ซ่อนปุ่มปิด Access ด้านล่างนี้ สามารถใช้งานได้ดีแล้วค่ะ
แต่ยังมีผลข้างเคียงนิดเดียวคือ หน้าต่างของ Access ที่ซ่อนปุ่มแล้วนั้นมัน move ไปมาได้เหมือนยังไม่ maximize อยากทราบว่าหากจะให้เปิดแบบ maximize ไว้เลยโดยห้ามไม่ให้ move เราต้องแก้ไขเพิ่มเติมโค้ดอย่างไรบ้างคะ


Private Const GWL_EXSTYLE = (-20)
    Private Const GWL_STYLE = (-16)

    Private Const WS_MAXIMIZEBOX = &H10000
    Private Const WS_MINIMIZEBOX = &H20000
    Private Const WS_SYSMENU = &H80000

    Private Const HWND_TOP = 0
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_NOSIZE = &H1
    Private Const SWP_FRAMECHANGED = &H20
    Private Const SWP_DRAWFRAME = SWP_FRAMECHANGED

    Private Declare Function SetWindowLong Lib "user32" _
    Alias "SetWindowLongA" (ByVal hwnd As Long, _
    ByVal nIndex As Long, ByVal dwNewLong As Long) _
    As Long
    Private Declare Function GetWindowLong Lib "user32" _
    Alias "GetWindowLongA" (ByVal hwnd As Long, _
    ByVal nIndex As Long) As Long
    Private Declare Function SetWindowPos Lib "user32" _
    (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
    ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
    ByVal cy As Long, ByVal wFlags As Long) As Long

    Sub HideAccessCloseButton()
        Dim lngStyle As Long
        lngStyle = GetWindowLong(hWndAccessApp, GWL_STYLE)
        lngStyle = lngStyle And Not WS_SYSMENU
        Call SetWindowLong(hWndAccessApp, GWL_STYLE, lngStyle)
        Call SetWindowPos(hWndAccessApp, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_DRAWFRAME)
    End Sub

    Sub UnHideAccessCloseButton()
        Dim lngStyle As Long
        lngStyle = GetWindowLong(hWndAccessApp, GWL_STYLE)
        lngStyle = lngStyle Or WS_SYSMENU
        Call SetWindowLong(hWndAccessApp, GWL_STYLE, lngStyle)
        Call SetWindowPos(hWndAccessApp, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_DRAWFRAME)
    End Sub


ขอบคุณค่ะ

14 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R07643
1 สร้าง module ใหม่ แล้วนำ code นี้ ไปวาง

Option Compare Database
Option Explicit

'which uses these declarations:

Declare Function GetActiveWindow Lib "User32" () As Integer

Declare Function GetParent Lib "User32" (ByVal hWnd As Integer) As Integer


Declare Function ShowWindow% Lib "User32" (ByVal hWnd%, ByVal nCmdShow%)


Global Const SW_MAXIMIZE = 3

Global Const SW_SHOWNORMAL = 1

Global Const SW_SHOWMINIMIZED = 2


Function AccessMaximize()

AccessMaximize = ShowWindow(GetAccesshWnd(), SW_MAXIMIZE)

End Function

Function GetAccesshWnd()

Dim hWnd As Integer

Dim hWndAccess As Integer


' Get the handle to the currently active window.

hWnd = GetActiveWindow()

hWndAccess = hWnd


' Find the top window without a parent window.

While hWnd <> 0

hWndAccess = hWnd

hWnd = GetParent(hWnd)

Wend


GetAccesshWnd = hWndAccess


End Function

2 สร้าง macro ชื่อ autoexec
    2.1 ช่อง action ให้ใช้คำสั่ง runcode
    2.2 ส่วนด้านล่าง Function name : AccessMaximize()
แล้ว save

แล้วลองปิด ms access แล้วเปิดใหม่
2 @R07648
ทำตามที่อาจารย์ ditasilk แนะนำแล้ว ก็ยังไม่สำเร็จค่ะ
Windows ของ Access ก็ยังคง Move ย้ายไปมาได้เช่นเดิม
สำหรับฟอร์มต่างๆนั้น เราสามารถเซ็ทค่าให้ตรึงอยู่กับที่ได้อยู่แล้ว
ติดอยู่ก็ที่ตัว Window ของ access เองเท่านั้น ที่เมื่อใช้โค้ดซ่อนปุ่มแล้ว มันกลายเป็นไม่ตรึงอยู่กับที่ค่ะ
3 @R07649
ผมคงเข้าใจผิด
code นี้ เป็น code ที่ Maximize Access Window ให้เต็มจอ
แล้วต่อด้วย code อ.สันติสุข จะซ่อน ปุมทั้ง 3 บน access window
แต่ไม่ได้ ดูเรื่องการ move access window ถ้ามีเวลาจะลองหาดูให้ครับ หรือรอให้ท่านอื่นมาตอบนะครับ
4 @R07650
มันมีอยู่ 2 อย่างที่พอจะทำได้ แต่ก็มีปัญหาเหมือนกันคือ

1. ทำให้ไม่มี Title Bar ไปเลย แต่ก็แสดงว่าจะไม่สามารถแสดงอะไรบน Title Bar ไปด้วย

2. สั่งให้ Maximize, Minimize ใช้ไม่ได้ แต่จะสั่งให้กลับมาใช้ได้ ยังหาวิธีไม่พบ และอันนี้ก็ยังไม่ได้ลองว่า ใช้ได้จริงหรือไม่

ไว้มีเวลาแล้วจะทดสอบให้นะครับ
5 @R07687
วิธีที่ 2 ผมทำแล้ว ผมอาจจะไม่เข้าใจว่า API ทำงานอย่างไรก็ได้ เลยไม่สำเร็จครับ

กลับมาแก้ไขโค้ดเดิม ใต้บรรทัด Private Const WS_SYSMENU = &H80000 ให้เพิ่มโค้ด Private Const WS_CAPTION = &HC00000 แล้วเปลี่ยนจาก lngStyle = lngStyle And Not WS_SYSMENU ไปเป็น lngStyle = lngStyle And Not WS_CAPTION ทั้ง 2 ตำแหน่ง ลองเล่นดูครับ
6 @R07695
สุดยอดเลยค่ะอาจารย์ แก้ไขตามที่ท่านแนะนำ 3 ตำแหน่งดังนี้

Option Compare Database

Private Const GWL_EXSTYLE = (-20)
    Private Const GWL_STYLE = (-16)

    Private Const WS_MAXIMIZEBOX = &H10000
    Private Const WS_MINIMIZEBOX = &H20000
    Private Const WS_SYSMENU = &H80000
    Private Const WS_CAPTION = &HC00000

    Private Const HWND_TOP = 0
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_NOSIZE = &H1
    Private Const SWP_FRAMECHANGED = &H20
    Private Const SWP_DRAWFRAME = SWP_FRAMECHANGED

    Private Declare Function SetWindowLong Lib "user32" _
    Alias "SetWindowLongA" (ByVal hwnd As Long, _
    ByVal nIndex As Long, ByVal dwNewLong As Long) _
    As Long
    Private Declare Function GetWindowLong Lib "user32" _
    Alias "GetWindowLongA" (ByVal hwnd As Long, _
    ByVal nIndex As Long) As Long
    Private Declare Function SetWindowPos Lib "user32" _
    (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
    ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
    ByVal cy As Long, ByVal wFlags As Long) As Long

    Sub HideAccessCloseButton()
        Dim lngStyle As Long
        lngStyle = GetWindowLong(hWndAccessApp, GWL_STYLE)
        lngStyle = lngStyle And Not WS_CAPTION
        Call SetWindowLong(hWndAccessApp, GWL_STYLE, lngStyle)
        Call SetWindowPos(hWndAccessApp, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_DRAWFRAME)
    End Sub

    Sub UnHideAccessCloseButton()
        Dim lngStyle As Long
        lngStyle = GetWindowLong(hWndAccessApp, GWL_STYLE)
        lngStyle = lngStyle Or WS_CAPTION
        Call SetWindowLong(hWndAccessApp, GWL_STYLE, lngStyle)
        Call SetWindowPos(hWndAccessApp, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_DRAWFRAME)
    End Sub

ผลข้างเคียงก็มีเหมือนกันค่ะ คือไม่สามารถแสดงอะไรบน Title Bar ไปด้วย แต่ปกติเราก็ไม่ได้ใช้แสดงอะไรที่ Title Bar อยู่แล้ว หนูคิดว่ามันเป็นผลข้างเคียงเชิงบวกด้วยซ้ำไป คือขณะรันโปรแกรมของเราที่ใช้โค้ดนี้ ผู้ใช้จะไม่สามารถเรียกใช้งานโปรแกรมอื่นๆได้ เพราะมันจะถูกซ่อนไปด้วยทั้งหมด (ทดสอบด้วย Windows XP-SP3 + Access2003) นอกจากนี้แล้วก็ยังไม่พบผลกระทบกับโค้ดอื่นๆในโปรแกรมค่ะ

สรุปคือโค้ดนี้มีประโยชน์มากเลยค่ะ ช่วยแก้ปัญหาการเผลอปิดXโปรแกรมโดยไม่ได้ตั้งใจได้เป็นอย่างดี เพื่อนๆสมาชิกลองนำไปประยุกต์ใช้ดูนะคะ

ขอขอบคุณอาจารย์สันติสุขมากๆค่ะ
7 @R07708
เรียนอาจารย์สันติสุข

โค้ดดังกล่าว เมื่อนำไปใช้กับ Access2007 แล้วไม่ยอมทำงาน
ในขณะที่ Access2003 และ 2010 ใช้งานได้ค่ะ

อันที่จริงตอนนี้หนูก็ไม่ได้ใช้ 2007 แล้ว แต่พอดีมีเพื่อนสมาชิกโพสถามปัญหาไว้ที่ T01736 จึงนำไปทดสอบกับเครื่องของเพื่อนดู ก็พบว่ากับ 2007 มันไม่ทำงานจริงๆค่ะ

อาจารย์คงต้องเหนื่อยสมองอีกแล้วละ
8 @R07710
อันนี้ไม่รู้จริงๆครับว่าทำไมเฉพาะ Acces2007 ถึงใช้ไม่ได้
9 @R07753
ทดลองใช้ กับ application ที่เขียนไว้ เมือปิด MS ACCESS 2007 แล้วเข้าใหม่ title bar ก็ไม่ปรากฏ สามารถใช้ได้ครับ
10 @R07755
เรียนอาจารย์ ditasilk

หมายถึงต้องไปเริ่มต้นสร้าง Module ที่ 2007 กันใหม่เลยหรือเปล่าคะ
เพราะหนูยังไม่ได้ทดลองวิธีนี้ค่ะ
11 @R07756
ปกติผมจะนำ code ที่เป็น win API ไว้ที่ Module อยู่แล้ว
เพื่อสะดวกในการอ้างอิง
เมื่อเปิดฟอร์ม(เป้าหมาย) ส่วนมากจะเป็นฟอร์มหลัก
ใช้เหตุการณ์ Form_Load เรียก Function
    Call AccessMaximize   'ทำให้ Access Window ขยาย maximize
    Call HideAccessCloseButton 'ซ่อนปุ่มและ Title Bar
แล้วบันทึก
ตอนแรก ก็เรียกดูเลย Title Bar ก็ยังเห็นอยู่ แต่ปุ่มหาย
เลยลองปิด MS ACCESS
แล้วเปิดเข้ามาอีกครั้ง คราวนี้ Title Bar จึงหายไป
หมายเหตุ :ทดลองกับ Application ที่เป็น 2007
12 @R07766
ไม่ทราบว่าใช้ windows อะไรเทสครับ

ของผม เป็น windows7 ultimate 32bit

นำไปไว้ในหลาย ๆ ฟอร์มดูแล้วก็ไม่ได้ผลครับ ทั้งฟอร์มหลัก ฟอร์มย่อย ฟอร์มตอนเปิดทีแรก ตอนโปรแกรมันตรวจสอบความปลอดภัย ก็ ไม่ได้ผลครับ ยังคงมีปุ่มของ access อยู่เหมือนเดิม


ไม่ทราบว่าจะเป็นที่ windows 7 ของผมหรือเปล่า
13 @R07767
Window Vista ครับ
การวาง code ไว้ที่ Module
แล้วเปิดฟอร์มหลัก(ฟอร์มแรก ก็ได้) ฟอร์มเดียว ที่ Form_load
Call HideAccessCloseButton

ก็ทำให้ Access Window ไม่มี ปุ่มบน Title Bar




14 @R07768
กรณีที่ใช้ WS_CAPTION แทน WS_SYSMENU ก็ไม่มี Title bar



run บน ms access 2007 win:vista
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3893s