标签: setwindowlong

删除窗口边框?

我有一个窗口,周围有一个坚固的边框.如何使用SetWindowLongGetWindowLong删除边框(所有非客户区域)?

winapi getwindowlong setwindowlong

28
推荐指数
3
解决办法
6万
查看次数

如何在64位版本的Windows中调用SetWindowLong()?

在头文件中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 …

c++ 64-bit winapi setwindowlong

16
推荐指数
1
解决办法
2万
查看次数

如何在32位平台上pinvoke到GetWindowLongPtr和SetWindowLongPtr?

我想P/Invoke到GetWindowLongPtrSetWindowLongPtr,我看到有关它们的相互矛盾的信息.

有些消息称,在32位平台上,GetWindowLongPtr只是一个调用GetWindowLong的预处理器宏,而GetWindowLongPtr不作为user32.dll中的入口点存在.例如:

  • SetWindowLongPtrpinvoke.net条目有一个静态方法,它检查IntPtr.Size,然后调用SetWindowLong或SetWindowLongPtr,注释说"遗留操作系统不支持SetWindowLongPtr".没有解释"遗留操作系统"的含义.
  • StackOverflow答案是 "On 32bit系统GetWindowLongPtr只是一个指向GetWindowLong的C宏".

因此,这些来源似乎表明*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会给我正确的入口点:

  • 如果我在32位操作系统上运行针对x86平台的应用程序?
  • 如果我在64位操作系统上运行针对x86平台的应用程序?
  • 如果我在64位操作系统上运行针对x64平台的应用程序?

.net c# pinvoke getwindowlong setwindowlong

13
推荐指数
1
解决办法
7915
查看次数

检测/挂钩窗口移动/拖动其他外部进程

检测其他进程的窗口移动/拖动的最佳方法是什么?在 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)

windows hook setwindowshookex setwindowlong

3
推荐指数
1
解决办法
1864
查看次数