anythinging 发表于 2019-10-25 18:53:12

【已解决】关于按任意键执行的实现方法

本帖最后由 anythinging 于 2019-10-27 10:24 编辑

我想实现按键盘任意键执行或退出程序,目前还未找到可行方案
尝试使用hotkeyset,_IsPressed,都必需指定按键,不知是否有更好的方案,实现按任意键执行?
感谢指点!

afan 发表于 2019-10-26 21:25:40

本帖最后由 afan 于 2019-10-26 23:33 编辑

GUIRegisterMsg($WM_KEYDOWN, "KEY")
改为 GUIRegisterMsg(0x0111, "KEY")
并移动到 _PicFullScreenShow($PicFile, $BackColor) 下面

GUISetState() 上面添加一行 GUICtrlCreateInput('', 0, 0, 1, 0)

贴代码要像2楼那样用代码标签,那样可以指明行号,这样解释费劲

WM_KEYDOWN在窗口有控件时不适用,这里是利用WM_COMMAND捕获按键在输入框消息,精简例子
Opt('GUIOnEventMode', 1)

GUICreate('')
GUISetOnEvent(-3, '_Exit')
GUICtrlCreateLabel('按任意(可打印)键退出', 100, 100)
GUICtrlCreateInput('', 0, 0, 1, 0)
GUISetState()
GUIRegisterMsg(0x0111, '_Com')

While 1
      Sleep(1000)
WEnd

Func _Com($h, $M, $w, $l)
      _Exit()
EndFunc   ;==>_Com
Func _Exit()
      Exit
EndFunc   ;==>_Exit

当然也可以Hook按键,但麻烦一点

862228699 发表于 2019-10-25 22:06:30

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Gui = GUICreate("按下任意键。", 370, 220, -1, -1, $WS_OVERLAPPEDWINDOW)
GUISetState()
GUIRegisterMsg($WM_KEYDOWN, "KEY")
Do
Until GUIGetMsg() = -3
Func KEY($hWnd, $Msg, $wParam, $lParam)
        MsgBox(0, '提示', '您按下了' & Chr($wParam) & '键')
EndFunc   ;==>KEY

dnvplj 发表于 2019-10-26 09:22:32

862228699 发表于 2019-10-25 22:06


请问,按Ctrl+Alt+Del键如何写。

anythinging 发表于 2019-10-26 09:43:43

862228699 发表于 2019-10-25 22:06


感谢指点,代码十分好用,但好象需要在gui下使用,如果是调用一个程序,比如计算器,按任意键就不起作用了。
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Gui = GUICreate("按下任意键。", 370, 220, -1, -1, $WS_OVERLAPPEDWINDOW)
GUISetState()
GUIRegisterMsg($WM_KEYDOWN, "KEY")
run('calc.exe')
Do
Until GUIGetMsg() = -3
Func KEY($hWnd, $Msg, $wParam, $lParam)
      MsgBox(0, '提示', '您按下了' & Chr($wParam) & '键')
EndFunc   ;==>KEY

zmdzhxj 发表于 2019-10-26 10:56:18

比较实用,学习了

anythinging 发表于 2019-10-26 20:34:52

本帖最后由 anythinging 于 2019-10-26 20:36 编辑

这个是A版的显示图片代码,需要按esc退出,如果想按任意键退出的话,尝试了不同的地方,不知将GUIRegisterMsg($WM_KEYDOWN, "KEY")加在哪里可以实现。
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>

Opt('GUIOnEventMode', 1)

Global $PicFile = 'D:\SYSTEM\DESKTOP\wallpaper\1834-105.jpg'       ;---- 图片文件路径
Global $BackColor = 0xE9E9E9      ;---- 背景色
GUIRegisterMsg($WM_KEYDOWN, "KEY")

_PicFullScreenShow($PicFile, $BackColor)

While 1
               Sleep(1000)
WEnd

Func _PicFullScreenShow($PicFile, $BackColor = 0)
      ;============== 全屏显示图片文件(缩放:仅缩小尺寸超出的图片)
      ;$PicFile - 图片文件路径
      ;$BackColor - 填充背景色

      Local $hGui = GUICreate('PhotoBrowser@afan', @DesktopWidth, @DesktopHeight, -1, 0, 0x80000000, 0x00000008)
                ;$WS_POPUP = 0x80000000 ;$WS_EX_TOPMOST = 0x00000008
      GUISetBkColor($BackColor)
      GUISetOnEvent(-3, '_Exit')
      __ImageToPicControls($PicFile, GUICtrlCreatePic('', 0, 0))
      If @Error Then Exit MsgBox(48, '错误', $PicFile & ' 非图片格式')
      GUISetState()
EndFunc   ;==>_PicFullScreenShow

Func __ImageToPicControls($PicFilePath, $PicControls)
      ;=============== 将图片设置到控件
      ;$PicFilePath - 图片文件路径
      ;$PicControls - 图片控件ID

      Local $hImage, $ImageWidth, $ImageHeight
      ;---- 载入图片
      _GDIPlus_Startup()
      $hImage = _GDIPlus_ImageLoadFromFile($PicFilePath)
      $ImageWidth = _GDIPlus_ImageGetWidth($hImage)
      $ImageHeight = _GDIPlus_ImageGetHeight($hImage)
      If $ImageWidth * $ImageHeight = 0 Then
                _GDIPlus_Shutdown()
                Return SetError(1)
      EndIf
      ;---- 计算图片高宽比及居中偏移
      Local $PicWidth = @DesktopWidth, $PicHeight = @DesktopHeight
      Local $PicCnAspectRatio = $PicHeight / $PicWidth
      Local $ImgAspectRatio = $ImageHeight / $ImageWidth
      Local $iOffset_X = 0, $iOffset_Y = 0, $hBMP, $hObject
      If $ImageWidth > $PicWidth Or $ImageHeight > $PicHeight Then
                If $ImgAspectRatio > $PicCnAspectRatio Then
                        $ImageHeight = $PicHeight
                        $ImageWidth = Round(1 / $ImgAspectRatio * $ImageHeight)
                        $iOffset_X = ($PicWidth - $ImageWidth) / 2
                Else
                        $ImageWidth = $PicWidth
                        $ImageHeight = Round($ImgAspectRatio * $ImageWidth)
                        $iOffset_Y = ($PicHeight - $ImageHeight) / 2
                EndIf
      Else
                $iOffset_X = ($PicWidth - $ImageWidth) / 2
                $iOffset_Y = ($PicHeight - $ImageHeight) / 2
      EndIf
      ;---- 将图像设置到控件
      $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
      $hObject = GUICtrlSendMsg($PicControls, 0x0172, 0, $hBMP)
                ;---- $STM_SETIMAGE = 0x0172, $IMAGE_BITMAP = 0
      _WinAPI_DeleteObject($hObject)
      _GDIPlus_ImageDispose($hImage)
      _WinAPI_DeleteObject($hBMP)
      _GDIPlus_Shutdown()
      GUICtrlSetPos($PicControls, $iOffset_X - 1, $iOffset_Y - 1, $ImageWidth, $ImageHeight)
EndFunc   ;==>__ImageToPicControls

Func _Exit()
      GUIDelete()
      Exit
EndFunc   ;==>_Exit

Func KEY($hWnd, $Msg, $wParam, $lParam)
      Exit
EndFunc   ;==>KEY

恳请指点,谢谢!

anythinging 发表于 2019-10-27 10:24:15

afan 发表于 2019-10-26 21:25
GUIRegisterMsg($WM_KEYDOWN, "KEY")
改为 GUIRegisterMsg(0x0111, "KEY")
并移动到 _PicFullScreenShow( ...

感谢指点,绝对好用!
页: [1]
查看完整版本: 【已解决】关于按任意键执行的实现方法