问题标签 [setwindowlong]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
66918 浏览

winapi - 去掉窗口边框?

我有一个窗口,它周围有一个实心边框。如何使用SetWindowLongGetWindowLong删除边框(所有非客户区) ?

0 投票
2 回答
4336 浏览

c# - 从 windows 样式中删除 WS_BORDER 和 WS_CAPTION 不起作用

我在 C# 中创建了一个小应用程序,它从窗口中删除边框和标题,然后将大小设置为用户的分辨率并将其居中。当我想在窗口模式下玩游戏而不被边框烦恼时,它是我使用的实用程序。大多数游戏一切正常,但我尝试在最近发布的游戏 Alpha Protocol 上使用它,但它不起作用。我几乎可以说游戏还原了我的更改,但我不确定如何判断这是否属实。我正在使用导入的 API 函数 MoveWindow、SetWindowLong 和 SetWindowPos。

片段:

0 投票
2 回答
8997 浏览

c# - 如何在 32 位平台上调用 GetWindowLongPtr 和 SetWindowLongPtr?

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

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

  • SetWindowLongPtr的pinvoke.net 条目有一个静态方法,该方法检查 IntPtr.Size,然后调用 SetWindowLong 或 SetWindowLongPtr,并带有注释说“旧版操作系统不支持 SetWindowLongPtr”。没有解释“遗留操作系统”的含义。
  • StackOverflow 上的答案指出“在 32 位系统上,GetWindowLongPtr 只是一个指向 GetWindowLong 的 C 宏”。

因此,这些来源似乎表明 *Ptr 入口点根本不存在于 user32.dll 版本中,例如 32 位 Windows 7。

但我在 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/Invoking to SetWindowLongPtr 会给我正确的入口点:

  • 如果我在 32 位操作系统上运行针对 x86 平台的应用程序?
  • 如果我在 64 位操作系统上运行针对 x86 平台的应用程序?
  • 如果我在 64 位操作系统上运行针对 x64 平台的应用程序?
0 投票
2 回答
1257 浏览

delphi - 使用 SetWindowLong 命令更改树视图的方向时,右键单击(弹出菜单)不起作用

当我使用 SetWindowLong 命令更改树视图的方向时,其节点上的弹出菜单不显示。完整代码在这里:

0 投票
2 回答
2685 浏览

c# - SetWindowLong 在某些计算机上不起作用

编辑:更多信息我已将其范围缩小到某些计算机上的某些应用程序。我正在尝试在某个显示器上以全屏模式启动 chrome。这在我测试过的大多数系统上都能完美运行,但是我们遇到了一组运行 Windows 7 Pro 32bit 的计算机,这些计算机正在正确移动和调整大小,但它们的边框和按钮仍然完好无损。

我意识到 chrome 窗口都在单个 chrome 进程下生成,并且它们的生命周期是易变的,但是我们已经能够使用单独的数据目录来解决这个问题,该目录使每个 chrome 实例以这种方式在它自己的父进程中启动。Chrome 似乎是唯一一个我们在启动全屏且仅在一组计算机上时遇到问题的应用程序。例如,在运行 calc.exe 时,它​​会在我们测试过的所有系统上最大化并移除边框,而不会出现任何问题。我已经确认在每个系统上运行的 chrome 版本是相同的。如果有人对这个问题或进一步解决问题的方法有更深入的了解,我将不胜感激。


我正在尝试使用 SetWindowLong 在全屏模式下运行应用程序,并且在我尝试使用的最新计算机之前它运行良好。我基本上使用这个问题中引用的代码:Removing window border?

这在我的两台笔记本电脑(Windows 7 Ultimate)和我测试过的几个工作箱(Windows 7 POS Embedded)上都可以正常工作,但它不能在另一台工作的计算机(Windows 7 Professional)上工作。SetWindowLong 调用返回的预期值向我表明它应该可以工作,并且对 SetWindowPos 的调用可以正常工作,因为它可以正确调整窗口大小,但边框和按钮仍然存在!它的功能就好像根本没有调用 SetWindowLong 一样。我将非常感谢一些帮助,因为此时我没有想法。

编辑:这是凌晨 1 点红眼荣耀的代码。几乎是链接问题的直接副本。

0 投票
1 回答
3399 浏览

c - SetWindowLongPtr 似乎不起作用

我试图子类化另一个窗口(在另一个进程中),所以我注入了一个调用 SetWindowLongPtr 的 dll,但它失败了,GetLastError 返回 5。

编辑:它绝对是正确的 PID。

编辑 2:我得到了错误的 HWND,但现在已修复(也编辑了代码) 我不再收到错误 5(来自 GetLastError)

感谢您的阅读!

0 投票
0 回答
992 浏览

api - SetWindowLong 和 SetLayeredWindowAttributes 不适用于不同的用户 C#

目标是

我想更改在 win xp 上运行的某些应用程序(目标)的不透明度。

情况

  • 我以 AD (active dir) 用户帐户 (some-domain\username) 登录 win xp
  • 大多数目标应用程序以本地用户或其他广告用户身份运行

问题和我的问题

SetWindowLong&SetLayeredWindowAttributes不适用于作为其他用户帐户运行的目标应用程序。但它适用于在同一用户帐户下运行的目标应用程序(登录用户帐户)

如何更改以不同用户帐户运行的其他应用程序的窗口不透明度?

插图应用

这是一个获胜表单应用程序(我们称之为 OpaciToggler.exe)。我有 2 个按钮(btnRunSomething 和 btnHideThatThing)和一个文本框(txtPid)。就如此容易。

当我单击 btnRunSomething 时,它以不同的用户身份运行 .exe。所有详细信息都在 app.config 中。在这种情况下,我以不同的用户 (localComputer\user1) 运行此应用程序(OpaciToggler.exe,来自 debug/bin)

txtPid 用于手动输入 pid。通常我打开任务管理器(win > run > taskmgr)并找到我想要测试的任何应用程序(目标)的pid(在进程选项卡下),然后在此处输入。

当我单击 btnHideThatThing 时,它将切换目标应用程序的不透明度(其 pid 在 txtPid 中)

代码 C#

这就是我调用目标应用程序的方式。

这就是我尝试调用不透明度的方式

隐藏方法

其他代码

RedrawWindowFlags 枚举(我不记得我从哪里得到的)

示例、测试和测试结果

  • 以 domainA\ad_user1 身份登录 win xp
  • 运行 OpaciToggler.exe 应用程序(Instance1,作为 domainA\ad_user1 运行)
  • 然后我点击运行一些东西。它会打开另一个 OpaciToggler.exe (Instance2),作为另一个用户帐户运行(作为 localcomputer\l_user1 运行)或右键单击 .exe,然后单击 run as..

实例1

  • PID:1234
  • 运行为:domainA\ad_user1
  • txtPid: 5678 (Instance2, 不工作)
  • txtPid:1234(自我,作品)
  • txtPid:任何 pid 作为同一个帐户运行(例如:notepad.exe、calc.exe 等都可以)

实例2

  • PID:5678
  • 运行为:localcomputer\l_user1
  • txtPid:1234(实例1,不起作用)
  • txtPid:5678(自我,作品)
  • txtPid:任何 pid 以同一帐户运行 (localcomputer\l_user1)(例如:notepad.exe、calc.exe 等,不起作用!!)

再次,我的问题

如何更改以不同用户帐户运行的其他应用程序的窗口不透明度?

感谢和抱歉我的英语不好:(。

0 投票
1 回答
1982 浏览

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

检测其他进程的窗口移动/拖动的最佳方法是什么?在 Windows7 64 位

我目前正在使用 C++ 和 C# 调查来自 DLL 的全局挂钩。这是一种痛苦,因为它不想正常工作。我在键盘和鼠标挂钩方面取得了一些成功。但是对于窗口消息,我只是不知道出了什么问题。

这是我的 .dll 文件中的代码

我正在考虑制作自己的 Aero Snap。这只是为了好玩。

谢谢你的帮助。

0 投票
3 回答
22055 浏览

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

在头文件WinUser.h中,有一部分SetWindowLong()定义了第二个参数的常量。

但是它们紧跟在未定义的 if_WIN64定义之后;它是在我的 64 位系统中定义的。

如您所见,还有一GWLP_***组常量,但它们没有记录在SetWindowLong().

为什么这些常量在 x64 系统中未定义?在 x64 系统
中调用的替代方法是什么?SetWindowLong()


我的系统:
操作系统:Windows 7 Ultimate x64 SP1
IDE:Visual Studio 2012 Ultimate Update 3

0 投票
1 回答
946 浏览

windows - 如何简化使用 SetWindowLong 和 GetWindowLong 修改窗口样式的代码?

我正在为 Windows API 编写一些包装函数和类。我开始遇到的一个常见情况是修改 Windows 样式。

以下是一些示例代码,我根据参数 ALIGNMENT 枚举调整 TextBox 的文本对齐方式。经过大量测试后,我似乎必须删除 2 种替代对齐样式,否则会发生冲突。然后 SetWindowPos(..SWP_FRAMECHANGED) 也不起作用,因此我将其替换为 InvalidateRect() 和 UpdateWindow() 以强制在样式更新后重新绘制 TextBox。

如果有更简单的方法,我想要一些反馈。我觉得我忽略了一些东西。谢谢!:)