ป้องกันการปิดโปรแกรม?
กระทู้เก่าบอร์ด อ.Yeadram

 14,093   36
URL.หัวข้อ / URL
ป้องกันการปิดโปรแกรม?

ถ้าเราไม่ต้องการให้ user ปิดโปรแกรมโดยที่ไม่ได้ตั้งใจเราต้องทำอย่างไรครับ...
...แบบว่า user จะไปคลิ๊ก X ที่มุมขวาบนแล้ว จะให้มี msgbox ขึ้นมาถามว่า are u sure ถ้าไม่ sure ก็ไม่ต้องปิด... อะไรประมาณนี้หนะครับ

ทำได้ไหมครับ

36 Reply in this Topic. Dispaly 2 pages and you are on page number 2

21 @R07618
เรียนอาจารย์สันติสุข โค้ดที่ท่านแนะนำ

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


วิธีใช้ทำอย่างไรคะ หนูลองเอาทั้งหมดไปวางไว้ที่ event ฟอร์มขณะเริ่มโหลด
แล้วมันใช้ไม่ได้ค่ะ ไม่ทราบว่านำไปใช้ถูกต้องหรือเปล่า ขอคำแนะนำด้วยนะคะ อยากได้มากเลยค่ะอาจารย์
22 @R07619
ตั้งแต่บบรทัดบนสุดจนถึงก่อนบรรทัด Sub HideAccessCloseButton() เป็นส่วนของการทำ declaration ดังนั้นให้วางไว้บนสุดของโมดูล (Module) ซึ่งอาจเป็นโมดูลของเดิมที่มีอยู่แล้วหรือจะสร้างโมดูลใหม่ขึ้นมาก็ได้ ส่วน Sub HideAccessCloseButton() จนจบ ให้วางไว้หลังจากจบส่วน declaration แล้ว หรือจะวางไว้ท้ายสุดของโมดูลเลยก็ได้ครับ
23 @R07623
หนูลองเดาทำดูแล้ว แต่ไม่สำเร็จ คือไม่ทราบวิธีนำไปใช้ให้มันเกิดผลค่ะ



อยากได้แต่ทำไม่เป็น ฮือๆๆๆ
24 @R07624
ยังไงครับไม่ค่อยเข้าใจ ที่คุณมาลีแสดงให้ดูในรูป ก็ถูกต้องแล้ว เวลาจะใช้ ก็เรียก call HideAccessCloseButton ก็ได้แล้วนี่ครับ
25 @R07626
เวลาจะใช้ ก็เรียก call HideAccessCloseButton ก็ได้แล้วนี่ครับ

ตรงนี้แหละค่ะ ที่หนูไม่เข้าใจว่า call HideAccessCloseButton อยู่ตรงไหนและใช้อย่างไร

หนูต้องการให้เปิดไฟล์ Access แล้ว ให้ซ่อนปุ่มทั้งสามนี้เลย



ขอคำแนะนำด้วยนะคะ ไม่ทราบจริงๆค่ะ
26 @R07627
ในระบบมีฟอร์มอะไรเป็นฟอร์มแรกที่ทำงานเสมอ ก็ใส่คำสั่งไว้ใน Form_Open event ของฟอร์มนั้นได้ครับ
27 @R07628
เย้...ได้แล้วค่ะอาจารย์



งมหาอยู่ตั้งนาน... เข้าตำราเส้นผมบังภูเขาหรือเปล่าก็ไม่ทราบนะคะ
เพียงแค่เอาไปใส่ใน event ของฟอร์มที่ต้องการเท่านั้นเองก็จบไปนานแล้ว

Private Sub Form_Close()
     Call UnHideAccessCloseButton
End Sub
----------------------------------------------------------------------
Private Sub Form_Open(Cancel As Integer)
     Call HideAccessCloseButton
End Sub

ขอบคุณอาจารย์สันติสุขมากเลยค่ะ หนูเกือบยอมแพ้ยกธงขาวแล้วเชียว
ขออภัยเจ้าของกระทู้ด้วย ที่แอบเข้ามาร่วมแจม
28 @R07703
ไม่ทราบว่าใช้กับ ACCESS2007 ได้ไหมครับ แล้วใช้ยังไงครับ ต้องไปใส่ทุกฟอร์มเลยหรือเปล่าครับ

ขอบคุณครับ
29 @R07704
ขอบคุณทุกท่าน ขอบันทึกไว้เป็นตัวอย่าง

ผมลองใช้กับ Access 2010 ก็ใช้ได้นะไว้ที่โมดูล แล้วก็เรียกใช้ตามที่คุณมาลีใช้
30 @R07706
ผมลองเอาไปใส่ ใน event ของหลาย ๆ ฟอร์มแล้ว ยังไม่เห็นได้เลยครับ ผมใช้ access2007 นะครับ

ไม่ทราบว่าท่านใดใช้ 2007 อยู่ ลองแล้วได้ผลยังไง รบกวนบอกทีนะครับ
31 @R07707
หนูได้ลองนำไปใช้กับ Access2007 ของเพื่อนดู ปรากฏว่าใช้ไม่ได้เช่นกันค่ะ
แต่กับ Access2003 และ 2010 นั้นใช้ได้ปกติ

หนูตั้งข้อสังเกตุดู รู้สึกว่า Access2007 มักจะเกิดปัญหากับโค้ดต่างๆ ที่สร้างจากAccess2003
ก่อนหน้านี้ก็เคยเจอปัญหากับโค้ด Export to Excel มาแล้ว ในขณะที่ 2010 นั้นใช้โค้ดร่วมกับ2003ได้ไม่มีปัญหาค่ะ

สาเหตเกิดจากอะไรนั้นหนูก็ไม่ทราบ ตั้งแต่ได้ 2010 มาใช้ ก็ไม่เคยเหลียวกลับไปใช้2007อีกเลย ปัจจุบันใช้ 2003 กับเครื่อง PC และ 2010 กับเครื่อง Notebook ค่ะ
32 @R07726
ใช้ได้นะครับ...
เข้าใจผิดกันหรือเปล่า
..ใน version 2007 ตัวที่ set security จะดูงงๆ... มันจะไม่เด้งขึ้นมาถามครับ
แต่มาจะโชว์เป็นแถบขึ้นมาด้านบน ให้เราไปกำหนดค่าว่าจะยอมให้ code ต่างๆทำงานหรือไม่... ถ้าไม่สังเกตุจะเห็นว่าโปรแกรมเปิดขึ้นมาและพร้อมใช้งานแล้ว คนเข้าใจผิดกันเยอะครับ

วิธีแก้ก็เหมือนใน version เดิม คือเข้าไป set security ให้เป็นระดับต่ำ
ยอมให้ code หรือ macro ต่างๆ run อัตโนมัติ
33 @R07728
มีรูปภาพประกอบไหมครับ


ขอบคุณครับ
34 @R07731
ผมแวะมาขอร่วม แบบผ่านๆ นะครับ ไม่ได้อ่านทุกกระทู้ ไม่ได้ทดลองทำ
ผมชวนตั้งข้อสังเกตไว้อย่างก็แล้วกันครับ

ฟังก์ชั่น API ที่ อ.สันติสุขแนะนำมา แล้วคุณมาลีนำไปประยุกต์ เท่าที่ผ่านแบบผ่านๆ สังเกตว่า มันใช้กับคอมพิวเตอร์ 32bit นะครับ

ของคุณ saknoi เป็น 64bit หรือเปล่าครับ
ถ้าเป็น 64bit อาจต้องปรับแก้ฟังก์ชั่น API ด้วยนะครับ

ลองค้น GOOGLE ดูนะครับ
......................
ขณะที่ผมยังโพสต์ไม่เสร็จ อดไม่ได้ เลยค้นมาให้หน่อยนึงครับ
สำหรับ 64bit ต้องปรับแก้ นิดหน่อยนะครับ PtrSafe ครับ คำนี้สำคัญนักแล

boblarson07-08-2010, 03:22 PM
Well, if you read the thread closely you should have noticed Banana's (Banana Republic there) mention of using PtrSafe in order for it to work.

So, changing these:

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, _
ByVal bRevert As Long) As Long

Private Declare Function EnableMenuItem Lib "user32" (ByVal hMenu As _
Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long

Private Declare Function GetMenuItemInfo Lib "user32" Alias _
"GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As _
Long, lpMenuItemInfo As MENUITEMINFO) As Long

to these:

Private Declare PtrSafe Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, _
ByVal bRevert As Long) As Long

Private Declare PtrSafe Function EnableMenuItem Lib "user32" (ByVal hMenu As _
Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long

Private Declare PtrSafe Function GetMenuItemInfo Lib "user32" Alias _
"GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As _
Long, lpMenuItemInfo As MENUITEMINFO) As Long

............. credit to http://www.access-programmers.co.uk/forums/archive/index.php/t-195525.html
35 @R07751
ทดลองแล้ว MS ACCESS 2007 สามารถใช้ได้ครับ
36 @R07754
ขอรายงานผลค่ะอาจารย์
ใช้กับคอมพิวเตอร์ 32bit และ set security ให้เป็นระดับต่ำ เหมือนกันทั้ง 2007 และ 2010
ผลที่ได้ตามในภาพเลยค่ะอาจารย์



สำหรับ 2003 นั้นไม่มีปัญหาอยู่แล้ว จึงไม่ได้นำภาพมาแสดงค่ะ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3736s