在cmd.exe窗口中,有一个名为" Scroll mode"的状态。在this site处有一个如何激活它的描述;通过键盘:Alt-Space,然后编辑,然后scroLl;或通过鼠标:右键单击标题栏,然后选择编辑和滚动。
我的问题很简单:Win-32 API函数用于激活此状态?
我查看了SetConsoleMode函数,但它不管理此模式(也不管理console functions的其他任何人)。我在网上搜索" cmd.exe滚动模式",但多个结果中没有一个引用此模式......
答案 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;
}