ฟังก์ชั่นที่ฉันต้องการบรรลุคือการเรียกใช้โปรแกรมเมื่อไม่มีการป้อนข้อมูลด้วยแป้นพิมพ์ การเคลื่อนไหวของเมาส์ หรือการคลิก สิ่งแรกที่นึกถึงคือการใช้ hook HOOK เพื่อรับการทำงานของแป้นพิมพ์หรือเมาส์ และเรียกใช้โปรแกรมหากไม่มีการดำเนินการใด ๆ ผลลัพธ์ของความพยายามของฉันคือมีปัญหาเสมอเมื่อทำการเกี่ยวและเกี่ยว
ต่อมาผมคิดว่าโปรแกรมรักษาหน้าจอของ Windows จะเข้าสู่โปรแกรมรักษาหน้าจอเมื่อแป้นพิมพ์และเมาส์ไม่ขยับจึงเปลี่ยนใจและต้องการให้โปรแกรมอยู่ในรูปแบบดังกล่าวเมื่อแป้นพิมพ์และเมาส์ไม่ขยับระบบ เข้าสู่โปรแกรมรักษาหน้าจอแล้วตรวจสอบว่าระบบกำลังรันโปรแกรมรักษาหน้าจออยู่หรือไม่ โปรแกรมจะถูกเรียกหากกำลังทำงานอยู่ วิธีนี้ใช้โปรแกรมรักษาหน้าจอเป็นตัวกลางและปล่อยให้งานตรวจจับการเคลื่อนไหวของแป้นพิมพ์และเมาส์อยู่ที่โปรแกรมรักษาหน้าจอ SystemParametersInfo สามารถใช้ฟังก์ชันเพื่อรับข้อมูลโปรแกรมรักษาหน้าจอ รหัสอ้างอิงมีดังนี้:
'การเรียก API และคำจำกัดความทั่วไป: ฟังก์ชั่นการประกาศส่วนตัว SystemParametersInfo _ Lib "user32" _ นามแฝง "SystemParametersInfoA" _ (ByVal uiAction As Long, _ ByVal uiParam As Long, _ pvParam เท่าใดก็ได้, _ ByVal fWInii As Long) As Boolean Private Const SPI_GETSCREENSAVEACTIVE ตราบใดที่ = &H10 'ค่าคงที่ว่าสกรีนเซฟเวอร์เปิดใช้งานอยู่หรือไม่ส่วนตัว Const SPI_GETSCREENSAVERRUNNING As Long = &H72 'ค่าคงที่ว่าสกรีนเซฟเวอร์กำลังทำงานอยู่หรือไม่Private Sub Timer1_Timer() Dim bRunning As Boolean 'ตัวแปรสำหรับว่าสกรีนเซฟเวอร์กำลังทำงานอยู่หรือไม่ แน่นอนคุณสามารถกำหนดตัวแปรโกลบอล SystemParametersInfo SPI_GETSCREENSAVERRUNNING, 0, bRunning, เท็จ 'เรียก API, bRunning ส่งคืนสถานะการทำงานของโปรแกรมรักษาหน้าจอ Debug.Print Time; "โปรแกรมรักษาหน้าจอทำงาน ="; bRunning 'สาธิต: พิมพ์ข้อมูลเกี่ยวกับว่าโปรแกรมรักษาหน้าจอกำลังทำงานอยู่หรือไม่ End Sub ' นอกจากนี้ เพื่อตรวจสอบว่าโปรแกรมรักษาหน้าจอเปิดใช้งานอยู่หรือไม่ คุณยังสามารถใช้วิธีการต่อไปนี้: SystemParametersInfo SPI_GETSCREENSAVEACTIVE, 0 , bActive, False 'bActive คือค่าตอบแทน (ประเภทลอจิคัล)
แต่ฉันไม่รู้ว่าทำไมฉันยังคงมีปัญหาในการดีบักภายใต้ WIN7 โดยแจ้ง SystemParametersInfo SPI_GETSCREENSAVERRUNNING, 0, bRunning, False
ประเภท bRunning ไม่ถูกต้องและสามารถยกเลิกได้เท่านั้น
สุดท้าย วิธีแก้ปัญหาสุดท้ายคือการใช้ฟังก์ชัน GetLastInputInfo เพื่อรับเวลาว่างของระบบ รหัสอ้างอิงมีดังนี้:
ตัวเลือก ExplicitPrivate Declare Function GetLastInputInfo Lib "user32" (plii As LASTINPUTINFO) As BooleanPrivate Declare Function GetTickCount Lib "kernel32" () As LongPrivate Type LASTINPUTINFO cbSize As Long dwTime As LongEnd Type Private Sub Form_Load() Timer1.Interval = 1,000 End Sub Private Sub Timer1_Timer() Dim lii As LASTINPUTINFO lii.cbSize = Len(lii) If GetLastInputInfo(lii) แล้ว If (GetTickCount - lii.dwTime) / 60000 >= 15 จากนั้นให้เรียก MsgBox("เนื่องจากเครื่องไม่ได้ทำงานเป็นเวลา 15 นาที ถ้า 3 นาที หากไม่มีการตอบสนอง ระบบจะถูกบังคับให้ปิดเครื่อง", vbYesNo + vbExclamation + vbDefaultButton2, "พร้อมท์") สิ้นสุดหากสิ้นสุด IfEnd Sub
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าทุกคนจะชอบมัน