gpt4 book ai didi

c++ - PRINTDLG 结构在不同进程的 hWnd 上使用

转载 作者:行者123 更新时间:2023-11-30 19:49:41 24 4
gpt4 key购买 nike

以下内容编译时没有错误或警告,但不会捕获 IEFrame 窗口,或者至少我知道它无法将该窗口的打印方向更改为横向:

PRINTDLGEX pd;
pd.lStructSize = (DWORD)sizeof(PRINTDLG);
BOOL GetPrinterDeviceDefaults(struct tagPDA* pd);

BOOL bRet=AfxGetApp()->GetPrinterDeviceDefaults(&pd);
pd.hwndOwner = FindWindow("IEFrame", NULL);
LPDEVMODE pDevMode = (LPDEVMODE)::GlobalLock(&pd.hDevMode);
pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
::GlobalUnlock(&pd.hDevMode);

我有证据表明代码可能已经获取了 IEFrame 窗口的 hWnd,因为 MessageBox(0,(LPCSTR)pd.hwndOwner,"[header]",MB_OK); 的结果显示了一些消息中的文字官样文章。而不是什么都没有。

感谢您的帮助。

最佳答案

我一点也不熟悉您尝试使用的 PRINTDLG API,但您的 MessageBox 代码都是错误的。

MessageBox function接受两个指向以 null 结尾的 C 字符串的指针(ANSI 字符串或 Unicode 字符串,具体取决于 UNICODE 是否由预处理器定义)。相反,您传递的是一个窗口句柄,它不是任何类型的以 null 结尾的 C 字符串——它只是一个仅对内核有意义的不透明数据值。因此,当 MessageBox 尝试解释字符串时,它会获得一个指向谁知道在哪里的指针,它要么因访问冲突而崩溃,要么从内存中读取随机的官样文章,直到遇到杂散的 NUL。字节。

通常编译器会在这里给你一个错误,但是通过插入强制转换,你会告诉你“没关系,我知道我在做什么,我保证这确实是一个 LPCTSTR”,这掩盖了错误。

对此的正确解决方法是将句柄值打印到字符数组中。例如:

#define DIM(x) (sizeof(x)/sizeof((x)[0]))
wchar_t handleStr[64];
_snprintf_s(handleStr, DIM(handleStr), _TRUNCATE, "Handle value: %p", (void*)pd.hwndOwner);
MessageBoxW(NULL, handleStr, L"[header]", MB_OK);

关于c++ - PRINTDLG 结构在不同进程的 hWnd 上使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11639641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com