กระทู้เก่าบอร์ด อ.Yeadram
        
           3,822   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
ขอบคุณค่ะ
    
  แต่ยังมีผลข้างเคียงนิดเดียวคือ หน้าต่างของ 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 
				
        
    2 @R07648    
        
  
      ทำตามที่อาจารย์ ditasilk แนะนำแล้ว ก็ยังไม่สำเร็จค่ะ
Windows ของ Access ก็ยังคง Move ย้ายไปมาได้เช่นเดิม
สำหรับฟอร์มต่างๆนั้น เราสามารถเซ็ทค่าให้ตรึงอยู่กับที่ได้อยู่แล้ว
ติดอยู่ก็ที่ตัว Window ของ access เองเท่านั้น ที่เมื่อใช้โค้ดซ่อนปุ่มแล้ว มันกลายเป็นไม่ตรึงอยู่กับที่ค่ะ
    
  Windows ของ Access ก็ยังคง Move ย้ายไปมาได้เช่นเดิม
สำหรับฟอร์มต่างๆนั้น เราสามารถเซ็ทค่าให้ตรึงอยู่กับที่ได้อยู่แล้ว
ติดอยู่ก็ที่ตัว Window ของ access เองเท่านั้น ที่เมื่อใช้โค้ดซ่อนปุ่มแล้ว มันกลายเป็นไม่ตรึงอยู่กับที่ค่ะ
        
    3 @R07649    
        
  
      ผมคงเข้าใจผิด 
code นี้ เป็น code ที่ Maximize Access Window ให้เต็มจอ
แล้วต่อด้วย code อ.สันติสุข จะซ่อน ปุมทั้ง 3 บน access window
แต่ไม่ได้ ดูเรื่องการ move access window ถ้ามีเวลาจะลองหาดูให้ครับ หรือรอให้ท่านอื่นมาตอบนะครับ
    
  code นี้ เป็น code ที่ Maximize Access Window ให้เต็มจอ
แล้วต่อด้วย code อ.สันติสุข จะซ่อน ปุมทั้ง 3 บน access window
แต่ไม่ได้ ดูเรื่องการ move access window ถ้ามีเวลาจะลองหาดูให้ครับ หรือรอให้ท่านอื่นมาตอบนะครับ
        
    4 @R07650    
        
  
      มันมีอยู่ 2 อย่างที่พอจะทำได้ แต่ก็มีปัญหาเหมือนกันคือ
1. ทำให้ไม่มี Title Bar ไปเลย แต่ก็แสดงว่าจะไม่สามารถแสดงอะไรบน Title Bar ไปด้วย
2. สั่งให้ Maximize, Minimize ใช้ไม่ได้ แต่จะสั่งให้กลับมาใช้ได้ ยังหาวิธีไม่พบ และอันนี้ก็ยังไม่ได้ลองว่า ใช้ได้จริงหรือไม่
ไว้มีเวลาแล้วจะทดสอบให้นะครับ
    
  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 ตำแหน่ง ลองเล่นดูครับ
    
    
  กลับมาแก้ไขโค้ดเดิม ใต้บรรทัด 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โปรแกรมโดยไม่ได้ตั้งใจได้เป็นอย่างดี เพื่อนๆสมาชิกลองนำไปประยุกต์ใช้ดูนะคะ
ขอขอบคุณอาจารย์สันติสุขมากๆค่ะ
    
  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 มันไม่ทำงานจริงๆค่ะ
อาจารย์คงต้องเหนื่อยสมองอีกแล้วละ
    
  โค้ดดังกล่าว เมื่อนำไปใช้กับ Access2007 แล้วไม่ยอมทำงาน
ในขณะที่ Access2003 และ 2010 ใช้งานได้ค่ะ
อันที่จริงตอนนี้หนูก็ไม่ได้ใช้ 2007 แล้ว แต่พอดีมีเพื่อนสมาชิกโพสถามปัญหาไว้ที่ T01736 จึงนำไปทดสอบกับเครื่องของเพื่อนดู ก็พบว่ากับ 2007 มันไม่ทำงานจริงๆค่ะ
อาจารย์คงต้องเหนื่อยสมองอีกแล้วละ
        
    8 @R07710    
        
  
      อันนี้ไม่รู้จริงๆครับว่าทำไมเฉพาะ Acces2007 ถึงใช้ไม่ได้    
    
  
        
    9 @R07753    
        
  
      ทดลองใช้ กับ application ที่เขียนไว้ เมือปิด MS ACCESS 2007 แล้วเข้าใหม่ title bar ก็ไม่ปรากฏ  สามารถใช้ได้ครับ    
    
  
        
    10 @R07755    
        
  
      เรียนอาจารย์ ditasilk
หมายถึงต้องไปเริ่มต้นสร้าง Module ที่ 2007 กันใหม่เลยหรือเปล่าคะ
เพราะหนูยังไม่ได้ทดลองวิธีนี้ค่ะ
    
  หมายถึงต้องไปเริ่มต้นสร้าง 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
    
  เพื่อสะดวกในการอ้างอิง
เมื่อเปิดฟอร์ม(เป้าหมาย) ส่วนมากจะเป็นฟอร์มหลัก
ใช้เหตุการณ์ 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 ของผมหรือเปล่า
    
  ของผม เป็น windows7 ultimate 32bit
นำไปไว้ในหลาย ๆ ฟอร์มดูแล้วก็ไม่ได้ผลครับ ทั้งฟอร์มหลัก ฟอร์มย่อย ฟอร์มตอนเปิดทีแรก ตอนโปรแกรมันตรวจสอบความปลอดภัย ก็ ไม่ได้ผลครับ ยังคงมีปุ่มของ access อยู่เหมือนเดิม
ไม่ทราบว่าจะเป็นที่ windows 7 ของผมหรือเปล่า
        
    13 @R07767    
        
  
      Window Vista ครับ
การวาง code ไว้ที่ Module
แล้วเปิดฟอร์มหลัก(ฟอร์มแรก ก็ได้) ฟอร์มเดียว ที่ Form_load
Call HideAccessCloseButton
ก็ทำให้ Access Window ไม่มี ปุ่มบน Title Bar
 
    
    
  การวาง code ไว้ที่ Module
แล้วเปิดฟอร์มหลัก(ฟอร์มแรก ก็ได้) ฟอร์มเดียว ที่ Form_load
Call HideAccessCloseButton
ก็ทำให้ Access Window ไม่มี ปุ่มบน Title Bar
 
        
    14 @R07768    
        
    
      กรณีที่ใช้ WS_CAPTION แทน WS_SYSMENU ก็ไม่มี Title bar
 
run บน ms access 2007 win:vista
    
   
run บน ms access 2007 win:vista
      Time: 0.7072s
    
      
		
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 แล้วเปิดใหม่