Basic 在QB64中捕获Alt-F4

Basic 在QB64中捕获Alt-F4,basic,qbasic,qb64,Basic,Qbasic,Qb64,我有一个实用程序,它有一个Alt-F4调用的函数,但我不能,因为它会关闭窗口。如何在QB64中捕获Alt-F4 以下代码示例显示了检查Alt-F4的各种方法: REM Trap Alt-F4 in QB64 DO _LIMIT 100 x$ = INKEY$ IF x$ = CHR$(27) THEN END IF LEN(x$) = 2 THEN IF ASC(RIGHT$(x$, 1)) = 107 THEN PRINT

我有一个实用程序,它有一个Alt-F4调用的函数,但我不能,因为它会关闭窗口。如何在QB64中捕获Alt-F4

以下代码示例显示了检查Alt-F4的各种方法:

REM Trap Alt-F4 in QB64
DO
    _LIMIT 100
    x$ = INKEY$
    IF x$ = CHR$(27) THEN END
    IF LEN(x$) = 2 THEN
        IF ASC(RIGHT$(x$, 1)) = 107 THEN
            PRINT "Alt-F4"
        END IF
    END IF
LOOP
END
还尝试了此方法,但没有效果:

KEY 15, CHR$(8) + CHR$(62)
ON KEY(15) GOSUB KeyTrap
KEY(15) ON
DO
    _LIMIT 100
    x$ = INKEY$
    IF x$ = CHR$(27) THEN END
LOOP
END
KeyTrap:
PRINT "Alt-F4"
RETURN
还尝试将Alt-F4捕获到退出陷阱中,但没有结果:

' start timer trap.
ON TIMER(1) GOSUB Timer.Trap
TIMER ON
VarQ = _EXIT
DO
    _LIMIT 100
LOOP
END
' timer ctrl-break trap.
Timer.Trap:
VarQ = _EXIT
_DELAY 1
IF VarQ THEN ' Control-Break
    x$ = INKEY$
    IF LEN(x$) = 2 THEN
        IF ASC(RIGHT$(x$, 1)) = 107 THEN
            PRINT "Alt-F4"
            RETURN
        END IF
    END IF
    CLS
    SYSTEM
END IF
RETURN
捕获Alt-F4的另一种可能方法:

DO
    _LIMIT 30
    b$ = INKEY$
    IF LEN(b$) THEN
        IF b$ = CHR$(27) THEN END
        DEF SEG = 0
        IF PEEK(1047) MOD 16 = 8 THEN
            IF b$ = CHR$(0) + "k" THEN
                PRINT "Alt-F4"
            END IF
        END IF
        DEF SEG
    END IF
LOOP
只有这样才能检查更多的击键

CONST KEY_RALT& = 100307
CONST KEY_LALT& = 100308
' start timer trap.
ON TIMER(1) GOSUB Timer.Trap
TIMER ON
VarQ = _EXIT
DO
    _LIMIT 100
LOOP
END
' timer ctrl-break trap.
Timer.Trap:
VarQ = _EXIT
_DELAY 1
IF VarQ THEN ' Control-Break
    x = _KEYHIT
    IF x = CVI(CHR$(0) + CHR$(62)) THEN ' F4
        IF _KEYDOWN(KEY_RALT&) OR _KEYDOWN(KEY_LALT&) THEN
            PRINT "Alt-F4"
            RETURN
        END IF
    END IF
    CLS
    SYSTEM
END IF
RETURN
还有一个使用内存地址检查的示例代码:

同样,它也不会捕获Alt-F4:

DO
    _LIMIT 30
    b$ = INKEY$
    IF LEN(b$) THEN
        IF b$ = CHR$(27) THEN END
        DEF SEG = 0
        IF PEEK(1047) MOD 16 = 8 THEN
            IF b$ = CHR$(0) + "k" THEN
                PRINT "Alt-F4"
            END IF
        END IF
        DEF SEG
    END IF
LOOP

我相信答案很简单:

全屏运行。 Alt+输入或更改程序设置。我忘了Alt+F4的chr$代码是什么,但我很确定它是
chr$(0)+chr$(x)
格式


希望这有帮助

Alt-F4的行为由Windows控制。我发现的一个建议是(请参阅第一个
DisableCloseButton
函数;
hwnd
在您的情况下将被
getforegroughindow()
替换)。另一方面,
PEEK
解决方案将无法工作,因为QB64的16位内存是模拟的,这意味着您正在读取内存,而不是硬件状态。当然,即使它起作用,您仍然需要在窗口消息循环处理按键之前阅读它(因为多线程)。MSDN说,它只启用/禁用关闭/最小化/最大化。我不想改变这些,只告诉QB64不要捕获Alt-F4。在这种情况下,您可能可以捕获单个消息,如
WM_KEYDOWN
;理论上,这将出现在
WM_SYSCOMMAND
之前,允许您过滤该按键,因此
WM_SYSCOMMAND
消息永远不会通过Alt-F4与
SC_CLOSE
一起传递。捕捉按键的类似选项可能是
RegisterHotKey
。然而,我从来都不需要这个特殊的功能,所以我不能确定这需要多少C代码,如果有的话,甚至不能确定你是否需要为一个新的消息循环启动你自己的线程,或者只是为了捕捉一个按键。为什么必须是alt-F4?作为一名软件开发人员,你应该为潜在用户的需求编写代码,我认为典型的用户不会对一个使用Windows快捷键的应用程序感到满意。最快也是最好的建议(在我35年以上的开发经验中)是选择另一个快捷键。电子稳定控制系统如何:)我曾经(几十年前)没有找到工作,因为我使用的旧代码使用F1作为退出键(中止),招聘经理说每个人都知道F1需要帮助。是的,我知道,但是我的客户十年来一直在使用F2寻求帮助。我只是同情而已。Alt-Enter对Alt-F4没有任何影响。他们都被窗口困住了。Alt+Enter是否全屏显示?我已经好几年没有使用Qbasic了,我手头上也没有安装Windows。我几乎100%肯定我成功地捕捉到了它,但我也知道我总是全屏奔跑。还有,这让我很吃惊,我想我使用的是QB32。Alt-Enter进入全屏与Alt-F4关闭窗口有什么关系?我使用的Qbasic版本,当程序处于全屏状态时,Windows不会捕获那么多关键命令。Alt+F4将因此无法被Windows捕获,我可以在Qbasic中捕获它。Alt+Enter只是将Qbasic置于全屏的按键命令(IIRC)。OK,我不知道。不过,对于我的用户来说,必须全屏关闭窗口仍然毫无意义。