我有一个窗口,周围有一个坚固的边框.如何使用SetWindowLong和GetWindowLong删除边框(所有非客户区域)?
在头文件中WinUser.h,有一个部分SetWindowLong()定义了第二个参数的常量.
// ...
#define GWL_WNDPROC (-4)
#define GWL_HINSTANCE (-6)
#define GWL_HWNDPARENT (-8)
#define GWL_STYLE (-16)
#define GWL_EXSTYLE (-20)
#define GWL_USERDATA (-21)
#define GWL_ID (-12)
#ifdef _WIN64
#undef GWL_WNDPROC
#undef GWL_HINSTANCE
#undef GWL_HWNDPARENT
#undef GWL_USERDATA
#endif /* _WIN64 */
#define GWLP_WNDPROC (-4)
#define GWLP_HINSTANCE (-6)
#define GWLP_HWNDPARENT (-8)
#define GWLP_USERDATA (-21)
#define GWLP_ID (-12)
// ...
Run Code Online (Sandbox Code Playgroud)
但是,如果_WIN64定义了未定义,它们就是正确的; 它在我的64位系统中定义.
如您所见,还有一GWLP_***组常量,但它们未在页面中记录SetWindowLong().
为什么这些常量在x64系统中未定义?在x64系统
中调用的替代方法是SetWindowLong()什么?
我的系统:
操作系统:Windows 7 Ultimate x64 SP1
IDE:Visual Studio …
我想P/Invoke到GetWindowLongPtr和SetWindowLongPtr,我看到有关它们的相互矛盾的信息.
有些消息称,在32位平台上,GetWindowLongPtr只是一个调用GetWindowLong的预处理器宏,而GetWindowLongPtr不作为user32.dll中的入口点存在.例如:
因此,这些来源似乎表明*Ptr入口点根本不存在于32位Windows 7附带的user32.dll版本中.
但我在MSDN文档中没有看到这一点.根据MSDN,SetWindowLongPtr取代了SetWindowLong,简单明了.根据SetWindowLongPtr页面的要求部分,看起来SetWindowLongPtr自Windows 2000(客户端和服务器版本)以来一直在user32.dll中.同样,没有提到32位操作系统中缺少的入口点.
我怀疑事实介于两者之间:当你告诉C++编译器定位较旧的操作系统(即编译将在Win9x和NT4上运行的东西)时,头文件将SetWindowLongPtr声明为调用SetWindowLong的宏,但是入口点可能确实存在于Windows 2000及更高版本中,如果您告诉编译器定位这些平台,您将直接获取它(而不是宏).但这只是猜测; 我真的没有资源或技术可以深入挖掘并验证它.
目标平台也可能扮演一个角色 - 如果您为x86平台编译应用程序,那么就不应该在64位操作系统上调用SetWindowLongPtr.再一次,我知道这个问题,但我不知道如何找到答案.MSDN似乎暗示SetWindowLongPtr始终是正确的.
任何人都可以告诉我,简单的P/Invoke到SetWindowLongPtr是否安全并完成它?(假设Windows 2000及更高版本.)P /调用SetWindowLongPtr会给我正确的入口点:
检测其他进程的窗口移动/拖动的最佳方法是什么?在 Windows7 64 位
我目前正在使用 C++ 和 C# 调查来自 DLL 的全局钩子。这是一种痛苦,因为它不想正常工作。我在键盘和鼠标挂钩方面取得了一些成功。但是对于窗口消息,我只是不知道出了什么问题。
这是我的 .dll 文件中的代码
#include <windows.h>
#include <iostream>
#include <stdio.h>
HINSTANCE hinst;
#pragma data_seg(".shared")
HHOOK hhk;
WNDPROC realProc;
#pragma data_seg()
//#pragma comment(linker, "/SECTION:.shared,RWS") compiler error in VC++ 2008 express
LRESULT CALLBACK wireKeyboardProc(int code, WPARAM wParam,LPARAM lParam) {
//open the standard out stream for writing
freopen("CONOUT$","w+t", stdout);
printf("code:%d wparam:%d lparam:%d\n", code, wParam, lParam);
/*
if (code < 0) {
return CallNextHookEx(0, code, wParam, lParam);
}
*/
//Beep(1000, 20);
return CallNextHookEx(hhk, code, …Run Code Online (Sandbox Code Playgroud)