我怎么能长时间转到HWND(C++ visual studio 8)?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
Run Code Online (Sandbox Code Playgroud)
但是我得到了以下警告:
警告C4312:'type cast':从'LONG'转换为更大尺寸的'HWND'
谢谢.
我正在开发一个python应用程序,我想获得HWND每个打开的窗口.我需要窗口的名称和HWND过滤列表来管理一些特定的窗口,移动和调整它们的大小.
我试图自己查看信息,但我没有得到正确的代码.我试过这个代码,但我只得到每个窗口的标题(这很棒),但我也需要它HWND.
import ctypes
import win32gui
EnumWindows = ctypes.windll.user32.EnumWindows
EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
GetWindowText = ctypes.windll.user32.GetWindowTextW
GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
IsWindowVisible = ctypes.windll.user32.IsWindowVisible
titles = []
def foreach_window(hwnd, lParam):
if IsWindowVisible(hwnd):
length = GetWindowTextLength(hwnd)
buff = ctypes.create_unicode_buffer(length + 1)
GetWindowText(hwnd, buff, length + 1)
titles.append((hwnd, buff.value))
return True
EnumWindows(EnumWindowsProc(foreach_window), 0)
for i in range(len(titles)):
print(titles)[i]
win32gui.MoveWindow((titles)[5][0], 0, 0, 760, 500, True)
Run Code Online (Sandbox Code Playgroud)
这里有一个错误:
win32gui.MoveWindow((titles)[5][0], 0, 0, 760, 500, True)
TypeError: The object is …Run Code Online (Sandbox Code Playgroud) 我的应用程序是一个vb6可执行文件,但系统中的一些较新的表单是用C#编写的.我希望能够使用主应用程序窗口的句柄设置C#表单的Owner属性,以便在我的应用程序和其他应用程序之间来回切换时,对话框保持在最顶层.
我可以获得主应用程序窗口的hwnd.我不确定我能从那里做什么?
更新2008年10月20日17:06:
斯科特,
谢谢你的回复.我忽略了Show/ShowDialog方法参数不是Form类型 - 我只查看Owner属性.
我稍微修改了我正在使用的代码 - 我们有一个组件通常加载我们的Forms并调用ShowDialog.我的代码看起来像这样:
Form launchTarget = FormFactory.GetForm(xxx); // psuedo-code for generic form loader
launchTarget.StartPosition = FormStartPosition.CenterParent;
IWin32Window parentWindow = GetWindowFromHwnd(hwnd);
launchTarget.ShowDialog(parentWindow);
Run Code Online (Sandbox Code Playgroud)
GetWindowFromHwnd 是代码的方法包装版本:
private IWin32Window GetWindowFromHost(int hwnd)
{
IWin32Window window = null;
IntPtr handle = new IntPtr(hwnd);
try
{
NativeWindow nativeWindow = new NativeWindow();
nativeWindow.AssignHandle(handle);
window = nativeWindow;
}
finally
{
handle = IntPtr.Zero;
}
return window;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这并不是我所希望的.表单以模态方式显示,但它没有显示在正确的位置,也没有在我离开并返回父窗口时仍然在顶部.我们的模态不会在任务栏中显示任务,因此窗口看起来"消失"(尽管它仍然存在于alt-tab窗口列表中).那对我来说表明我可能没有合适的人.如果您有任何其他建议,请回复.再次感谢.
更新于2008年11月10日16:25
一个跟进注释 - 如果你将它分解为try/finally中的方法调用,就像在Scott的第二篇文章中那样,finally块中的调用应该是:
parentWindow.ReleaseHandle();
Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用System.Windows.Controls.WebBrowser进行各种操作,我注意到当它们应该出现在WebBrowser上时,它们会被切断.我意识到WebBrowser控件实际上是一个COM组件的包装器,可能呈现不同的方式,但我想知道是否有人想出如何解决这个问题.
这是我看到的问题.在这里,我只有一个样本装饰,应该在某个东西的顶角绘制一个大的红色圆圈(作为样本).
当我用这个装饰WebBrowser时,我得到了这个结果:
我希望看到完整的圆圈.
这是这个毫无价值的装饰者的代码,以防有用:
public class SillyAdorner : Adorner
{
public SillyAdorner(UIElement element) : base(element)
{
}
protected override void OnRender(DrawingContext drawingContext)
{
drawingContext.DrawEllipse(new SolidColorBrush(Colors.Red), new Pen(), new Point(7, 7), 30, 30);
base.OnRender(drawingContext);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我在主机控件的OnRender方法中将其应用于浏览器的方法:
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
var layer = AdornerLayer.GetAdornerLayer(browser);
layer.Add(new SillyAdorner(browser));
}
Run Code Online (Sandbox Code Playgroud)
有没有任何黑客或解决方法?
编辑:我正在使用.NET 4.0,如果这有所作为.
编辑#2:WebBrowser似乎继承自HwndHost,我已经看到了关于adorners和hwndsources的另外一两个问题,但我没有看到任何看起来像我可以为WebControl实现它的东西,但希望这是有用的信息有人.
在调试/单步执行Visual Studio时,是否有任何众所周知的工具或插件可用于获取有关HWND的属性?我知道我可以使用Spy ++来做这些事情,但是这样做也很麻烦,同时也踩着调试器.我喜欢做的是将HWND放入Watch子窗口,看看如下内容:
这对我来说似乎是非常基本的东西,对任何人都有用.这样的插件存在吗?我可以通过使用Autoexp.dat玩游戏来实现这一目标吗?
我正在尝试获取活动窗口的名称,如任务管理器应用程序列表中所示(使用 c#)。我遇到了与此处所述相同的问题。我试图按照他们的描述去做,但是我遇到了问题,而重点应用程序是我得到异常的图片库。我也试过这个,但没有给我预期的结果。现在我使用:
IntPtr handle = IntPtr.Zero;
handle = GetForegroundWindow();
const int nChars = 256;
StringBuilder Buff = new StringBuilder(nChars);
if (GetWindowText(handle, Buff, nChars) > 0)
{
windowText = Buff.ToString();
}
Run Code Online (Sandbox Code Playgroud)
并根据我为大多数常见应用程序创建的表删除不相关的内容,但我不喜欢这种解决方法。有没有办法获取所有正在运行的应用程序的任务管理器中的应用程序名称?
这篇简短的MSDN文档称CoreWindow具有ICoreWindowInterop,它获取CoreWindow的句柄HWND.但我找不到如何获得它的参考(C#).请帮忙.
https://msdn.microsoft.com/en-us/library/dn302119(v=vs.85).aspx
我正试图从一个获得属性HWND.我使用了" 使用窗口属性"中的信息,但下面的示例对我不起作用.我在编译代码时遇到错误.
类型"BOOL(__stdcall*)(HWND hwndSubclass,LPCSTR lpszString,HANDLE hData)"的参数与"PROPENUMPROCEXW"类型的参数不兼容
这是我的回调函数
BOOL CALLBACK PropEnumProcEx(HWND hwndSubclass, LPCSTR lpszString, HANDLE hData) {
return TRUE;
}
Run Code Online (Sandbox Code Playgroud)
这就是我如何使用它
EnumPropsEx(hwnd, PropEnumProcEx, NULL);
Run Code Online (Sandbox Code Playgroud)
有人有任何关于如何解决这个问题的建议吗?