标签: getwindowlong

删除窗口边框?

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

winapi getwindowlong setwindowlong

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

如何在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
查看次数

GetWindowLong与C#中的GetWindowLongPtr

我像这样使用GetWindowLong:

[DllImport("user32.dll")]
private static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);
Run Code Online (Sandbox Code Playgroud)

但根据MSDN文档,我应该使用GetWindowLongPtr与64位兼容. http://msdn.microsoft.com/en-us/library/ms633584(VS.85).aspx

GetWindowLongPtr的MSDN文档说我应该像这样定义它(在C++中):

LONG_PTR GetWindowLongPtr(HWND hWnd, int nIndex);
Run Code Online (Sandbox Code Playgroud)

我曾经使用IntPtr作为返回类型,但是我将使用什么来替代LONG_PTR?我也看到在C#中将GetWindowLong定义为:

[DllImport("user32.dll")]
private static extern long GetWindowLong(IntPtr hWnd, int nIndex);
Run Code Online (Sandbox Code Playgroud)

什么是正确的,我如何确保正确的64位兼容性?

c# getwindowlong

3
推荐指数
2
解决办法
7250
查看次数

我不断收到“无法在DLL'user32.dll'中找到名为'GetWindowLongPtrA'的入口点”

我正在尝试使用,GetWindowLongPtrA但我一直收到“无法在DLL'user32.dll'中找到名为'GetWindowLongPtrA'的入口点”。(也会SetWindowLongPtrA出现相同的错误)。我已经尝试了许多在Google上找到的解决方案,但是他们没有解决。

这是我编写的函数的声明:

[DllImport("user32.dll")]
public static extern IntPtr GetWindowLongPtrA(IntPtr hWnd, int nIndex);
Run Code Online (Sandbox Code Playgroud)

尝试将put EntryPoint = "GetWindowLongPtrA",更改GetWindowLongPtrAGetWindowLongPtr,put CharSet = CharSet.Ansi,切换为GetWindowLongPtrWwith CharSet = CharSet.Unicode等,它们都不起作用。

我的计算机正好是“ 64位”(但是不能调用该64位WinAPI函数吗?)。操作系统是Windows 10。

[1]:https://i.stack.imgur.com/3JrGw.png

但是我的系统驱动器的可用空间不足。这可能是原因吗? 在此处输入图片说明

这个问题有什么解决方案?

.net c# pinvoke winapi getwindowlong

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

WM_CTLCOLORSTATIC lParam,C++ WINAPI

我正在尝试包含到我的对话窗口过程中,当收到msg WM_CTLCOLORSTATIC时,我得到正在发送消息的Control的ID.

case WM_CTLCOLORSTATIC: 
        UINT ID = GetWindowLong((HWND)lParam, GWL_ID);
Run Code Online (Sandbox Code Playgroud)

问题是......当我尝试输入WM_CTLCOLORSTATIC的lParam时,它返回值65535,这是不正确的; 我甚至没有最大UINT ID为65535的资源项.

你能告诉我为什么会这样吗?

c++ winapi getwindowlong resource-id

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

标签 统计

getwindowlong ×5

c# ×3

winapi ×3

.net ×2

pinvoke ×2

setwindowlong ×2

c++ ×1

resource-id ×1