我的问题是在 Windows 10 计算机上从 GetWindowPlacement 获取 WINDOWPLACEMENT 结构。我获得了一个有效的窗口句柄,并且创建的结构看起来不错,但调用 GetWindowPlacement 失败。 这是我的代码:
#!/usr/bin/perl
use strict;
use warnings;
use Win32::API;
my $wpl; # WINDOWPLACEMENT structure
my $hwnd;
my $rv;
Win32::API->Import("user32", "FindWindow", "PP", "N");
Win32::API->Import("user32", "GetWindowPlacement", "NP", "I");
Win32::API::Struct->typedef( 'POINT', qw(
LONG x;
LONG y;
));
Win32::API::Struct->typedef( 'RECT', qw(
LONG left;
LONG top;
LONG right;
LONG bottom;
));
Win32::API::Struct->typedef( 'WINDOWPLACEMENT', qw(
UINT length;
UINT flags;
UINT showCmd;
POINT ptMinPosition;
POINT ptMaxPosition;
RECT rcNormalPosition;
RECT rcDevice;
));
$hwnd = FindWindow('SciCalc', 0);
print("window handle: $hwnd\n");
$wpl = Win32::API::Struct->new( 'WINDOWPLACEMENT' );
$wpl->{length} = Win32::API::Struct::sizeof($wpl);
print("pointer: $wpl\n");
print("length: $wpl->{length}\n");
$rv = GetWindowPlacement($hwnd, $wpl);
print("return value: $rv\n");
exit(0);
__END__
结果是:
window handle: 722532
pointer: Win32::API::Struct=HASH(0x2609b60)
length: 60
Win32::API::Call: parameter 2 had a buffer overflow at C:\Users\ma\MyFolder\test\winpos.pl line 41.
使用 AutoIt3 获取 WINDOWPLACement 结构给了我:
![AutoIt3 结果] AutoIt3
最佳答案
解决方案是改变:
Win32::API->Import("user32", "GetWindowPlacement", "NP", "I");
至:
Win32::API->Import("user32", "GetWindowPlacement", "NT", "I");
发现于 documentation .
关于GetWindowPlacement 处的 Perl Win32::API 缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72474055/