首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >User32 SetWindowLong接受int而不是long

User32 SetWindowLong接受int而不是long
EN

Stack Overflow用户
提问于 2016-01-03 14:30:52
回答 1查看 1.3K关注 0票数 1

当我试图在C#,SetWindowLong中从User32.dll调用一个函数时,什么都不会发生。我知道为什么,但我不知道怎么“修理”这个。这是一段代码。

代码语言:javascript
复制
[DllImport("user32.dll")]
public static extern long GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
public static extern long SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
const int WS_EX_TOPMOST = 0x00000008;
const int GWL_EXSTYLE = -20;
public static bool IsWindowTopMost(int id)
{
    return (GetWindowLong(GetHWNDById(id), GWL_EXSTYLE) & WS_EX_TOPMOST) == WS_EX_TOPMOST;
}
public static void SetAlwaysOnTop(int id)
{
    IntPtr hWnd = GetHWNDById(id);
    long actuallyStyle = GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_TOPMOST;
    SetWindowLong(hWnd, GWL_EXSTYLE, (int)actuallyStyle));
}

IsWindowTopMost工作得很好,但SetAlwaysOnTop不工作。在快速检查了代码之后,我发现了一些有趣的东西。变量"actuallyStyle“在GetWindowLong后等于4295295232,在OR操作后为4295295240。这就是问题所在,函数SetWindowLong接受作为dwNewLong的整数。当我在SetWindowLong的定义中用long更改int时,pinvoke会抛出一个错误,因为“不匹配的函数和目标函数”。

它是怎么转过来的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-03 14:57:27

将窗口始终放在顶部的正确方法是使用SetWindowPos函数。问题很可能是SetWindowLong只是设置了一个变量,但实际上SetWindowPos会通知窗口管理器执行所需的重绘,所以请使用它。

关于问题标题,SetWindowLongGetWindowLong都必须声明为int,而不是long

以下是两个原因。首先,C和C#的区别。整个Windows文档都是用C术语其中long表示32位有符号整数。定义的,但是C#威胁long是一个64位有符号整数,因此给出了您正在获得的错误。使用64位的函数在API文档中声明为long long

造成这种差异的另一个原因是历史原因。这两个函数都是在Windows的16位时代创建的,其中int是16位,long是32位。int类型在后一种情况下进行了扩展,但long保持原样。名称没有更改以保持兼容性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34577624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档