如何激活cmd.exe窗口"滚动模式"通过Win-32 API函数?

时间:2016-11-28 05:24:58

标签: windows winapi

在cmd.exe窗口中,有一个名为" Scroll mode"的状态。在this site处有一个如何激活它的描述;通过键盘:Alt-Space,然后编辑,然后scroLl;或通过鼠标:右键单击标题栏,然后选择编辑和滚动。

我的问题很简单:Win-32 API函数用于激活此状态?

我查看了SetConsoleMode函数,但它不管理此模式(也不管理console functions的其他任何人)。我在网上搜索" cmd.exe滚动模式",但多个结果中没有一个引用模式......

1 个答案:

答案 0 :(得分:2)

经过一些挖掘和测试后,“似乎”任何公共API函数都没有公开此行为。虽然有人发现了一种非显而易见的方式(或者更明显的方式),但可以使用此解决方法

#define _WIN32_WINNT   0x0500
#include <windows.h>

#define SC_SCROLL 0xFFF3

int main(void) {
    HWND hWnd;

    // Search current console
    if (!(
        hWnd = GetConsoleWindow()
    )) return 1;

    // Set scroll mode
    if ( 
        SendMessage(
            hWnd
            , WM_SYSCOMMAND
            , (WPARAM) SC_SCROLL
            , (LPARAM) NULL 
        ) != 0
    ) return 2;

    // Done
    return 0;
}

已修改以适应评论

要禁用滚动,我们只需要 Enter Esc Ctrl-C 按键

#define _WIN32_WINNT   0x0500
#include <windows.h>

#define KEYEVENTF_KEYDOWN 0

int main(void) {
    INPUT ip;

    // Keyboard input structure initialize
    ip.type = INPUT_KEYBOARD;
    ip.ki.wScan = 0;
    ip.ki.time = 0;
    ip.ki.dwExtraInfo = 0;

    // Control key down
    ip.ki.wVk = VK_CONTROL;
    ip.ki.dwFlags = KEYEVENTF_KEYDOWN;
    SendInput( 1, &ip, sizeof(INPUT) );

    // C key down
    ip.ki.wVk = 'C';
    ip.ki.dwFlags = KEYEVENTF_KEYDOWN;
    SendInput( 1, &ip, sizeof(INPUT) );

    // C key up
    ip.ki.wVk = 'C';
    ip.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput( 1, &ip, sizeof(INPUT) );

    // Control key up
    ip.ki.wVk = VK_CONTROL;
    ip.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput( 1, &ip, sizeof(INPUT) );

    // Done
    return 0;
}

此代码发送 Ctrl + C ,但您无法指示按键的目标。为了避免焦点丢失的问题,最好将 Esc 直接发送到窗口

#define _WIN32_WINNT   0x0500
#include <windows.h>

int main(void) {
    int KEY = VK_ESCAPE;
    unsigned int lParamKeyDown = 0;
    unsigned int lParamKeyUp = 0;

    HWND hWnd;

    // Search current console
    if (!(
        hWnd = GetConsoleWindow()
    )) return 1;

    // Configure lParam for key down event
    lParamKeyDown |= 1;
    lParamKeyDown |= 1 << 24;
    lParamKeyDown |= MapVirtualKey(KEY, 0) << 16;

    // Configure lParam for key up event
    lParamKeyUp |= 1 << 30;
    lParamKeyUp |= 1 << 31;
    lParamKeyUp |= MapVirtualKey(KEY, 0) << 16;

    // Send the key
    SendMessage( hWnd, WM_KEYDOWN, KEY, lParamKeyDown );
    SendMessage( hWnd, WM_KEYUP, KEY, lParamKeyUp );

    // Done
    return 0;
}