找回密码
 加入
搜索
查看: 1543|回复: 7

[AU3基础] 【已解决】关于按任意键执行的实现方法

[复制链接]
发表于 2019-10-25 18:53:12 | 显示全部楼层 |阅读模式
本帖最后由 anythinging 于 2019-10-27 10:24 编辑

我想实现按键盘任意键执行或退出程序,目前还未找到可行方案
尝试使用hotkeyset,_IsPressed,都必需指定按键,不知是否有更好的方案,实现按任意键执行?
感谢指点!
发表于 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按键,但麻烦一点

评分

参与人数 1金钱 +30 收起 理由
anythinging + 30 赞一个!

查看全部评分

发表于 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
发表于 2019-10-26 09:22:32 | 显示全部楼层

请问,按Ctrl+Alt+Del键如何写。
 楼主| 发表于 2019-10-26 09:43:43 | 显示全部楼层

感谢指点,代码十分好用,但好象需要在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
发表于 2019-10-26 10:56:18 | 显示全部楼层
比较实用,学习了
 楼主| 发表于 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


恳请指点,谢谢!
 楼主| 发表于 2019-10-27 10:24:15 | 显示全部楼层
afan 发表于 2019-10-26 21:25
GUIRegisterMsg($WM_KEYDOWN, "KEY")
改为 GUIRegisterMsg(0x0111, "KEY")
并移动到 _PicFullScreenShow( ...

感谢指点,绝对好用!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-28 21:27 , Processed in 0.077763 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表