我怎么能检测到任何应用程序失去焦点?是否有任何系统挂钩可供使用?我想在新的应用程序处于焦点或丢失的时候接收.即使拥有用户的"当前"HWND也会很好.
我正在使用C#,但是,我确信它的所有赢得api的东西......所以任何信息都会很棒.
我的WPF应用程序以大约4kb/s的速度泄漏内存.任务管理器中的内存使用量不断攀升,直到应用程序崩溃并出现"内存不足"异常.
通过我自己的研究,我发现这里讨论的问题是:在WPF和#8中追踪内存泄漏:http://blogs.msdn.com/jgoldb/archive/2008/02/04/finding-memory-泄漏功能于WPF的基于applications.aspx
描述的问题是: 这是在框架版本中存在的WPF泄漏,包括.NET 3.5 SP1.这是因为WPF选择使用哪个HWND将消息从呈现线程发送到UI线程.此示例销毁创建的第一个HWND并在新窗口中启动动画.这会导致从渲染线程发送的消息堆积而不进行处理,从而有效地泄漏内存.
提供的解决方案是: 解决方法是在App类构造函数中首先创建一个新的HwndSource.这必须在WPF创建任何其他HWND之前创建.只需创建这个HwndSource,WPF就会使用它来从渲染线程向UI线程发送消息.这样可以确保处理所有消息,并且不会泄漏任何消息.
但我不明白解决方案! 我有一个我正在使用的Application的子类,我尝试在该构造函数中创建一个窗口但是没有解决问题.
按照字面意思给出的说明,看起来我只需要将它添加到我的Application构造函数中:
new HwndSource(new HwndSourceParameters("MyApplication"));
Run Code Online (Sandbox Code Playgroud) 我正在开发一个由许多独立子系统组成的系统.其中两个子系统是Window和GraphicsAdapter子系统.
GraphicsAdapter需要一个低级窗口句柄(HWND或X11窗口句柄,具体取决于操作系统),而Window子系统是一种抽象这些特定于操作系统的API的方法.
如果Window子系统允许访问低级API句柄,那么封装将有很大的可能性被破坏.
如果它允许窗口全屏显示并返回,但是必须触发事件警告系统有关这些更改,并且低级别句柄用于在不知情的情况下切换到全屏?
如何确保把手从Window子系统安全地传送到GraphicsAdapter而不被滥用,并且仍然足够灵活,以便稍后可以添加其他子系统,如GraphicsAdapter,同时保持类型安全?
有没有办法以一种方式封装句柄Direct3D和OpenGL可以从句柄访问正常工作?
- 编辑
另外,从一个子系统到另一个子系统安全地携带手柄,例如,知道子系统可以由不同的编码器团队编写,有没有办法提醒他们手柄的使用方式?
注释是显而易见的选择,但编译器强制执行的是我真正想要的...
我正在尝试在 JPanel 中嵌入 HWND(窗口句柄)。
实际上,我可以将我的 HWND 嵌入到 JFrame 中,但是嵌入的窗口始终位于其他组件的顶部,我无法移动它。如果尝试删除我的 JFrame 的所有子组件,HWND 会留在那里。HWND 似乎是在 JFrame 之上绘制的,而不是其中之一。
要将 HWND 嵌入 JPanel,我通过 jna 使用 User32:
User32.SetParent(iage.getRenderHwnd(), (int) getGUIHwnd(j));
Run Code Online (Sandbox Code Playgroud)
我用它来获取我的 JFrame 的 HWND:
j.getPeer() != null ? ((WComponentPeer) j.getPeer()).getHWnd(): 0;
Run Code Online (Sandbox Code Playgroud)
有没有办法将 HWND 嵌入 JPanel 或将其添加到其他组件中,以便我可以像在 UI 中一样放置它?
谢谢
我做了一些搜索,但我找不到一个确切的答案.在我的C#WPF应用程序中,我获得了HWND指针并将其传递给C dll.然后,C dll尝试使用GDI调用在窗口上呈现排序叠加.没有错误,但没有出现任何错误.如果我切换到Windows窗体,该DLL可以很好地渲染它.如果我托管一个WindowsFormHost控件并使用那里的hwnd我有相同的效果.我已经看到了关于HwndHost控件的信息,但它看起来并不像我想要的那样.也许对这种控制有更多了解的人可以用不同的方式告诉我.我在某处读到用于DirectX渲染的hwnd(如WPF)也不能使用GDI.这会让我的场景变得不可能吗?我可以通过在WPF窗口上覆盖无边框形式来伪造它,但显然这不会太漂亮.有什么想法或想法吗?
这不是一个复杂的问题.我找不到属于iTunes的句柄了.但是虽然iTunes在后台运行,但它一直告诉我它无法找到窗口.所以我继续检查我是否错过键入窗口名称,但间谍++向我指出我使用了正确的窗口名称和类名(见下文).我确定这是一个小错误,但我似乎无法找到它.有没有人有洞察力?提前致谢.
HWND hwnd;
hwnd = FindWindow((LPCWSTR)"iTunes",(LPCWSTR)"iTunes");
if (hwnd != 0){
cout << "WINDOW FOUND" << endl;
} else {
cout << "WINDOW NOT FOUND" << endl;
cout << hwnd << endl;
}
Run Code Online (Sandbox Code Playgroud) 我注意到当我使用shell函数打开它时应用程序处理.然后我使用该句柄稍后关闭应用程序.但是,用户也可以自己关闭其他应用程序.那个句柄可以被windows重用,这样当我使用该句柄时,我会关闭一个不同的进程.如果可能的话可能吗?
我正在为excel开发一个add.在某些时候,我可以收到异步事件.如果隐藏在这些事件上,我需要能够显示Excel窗口.
我能够存储Hwnd属性,我认为必须是一个不可变的int /引用来标识我的Excel窗口.
有人可以详细说明这个Hwnd吗?并解释我如何使用C#显示一个隐藏的窗口?
在此先感谢大家;)
更新:很快,这是解决我的问题的代码片段:
/// <summary>Enumeration of the different ways of showing a window using
/// ShowWindow</summary>
private enum WindowShowStyle : uint
{
/// <summary>Hides the window and activates another window.</summary>
/// <remarks>See SW_HIDE</remarks>
Hide = 0,
/// <summary>Activates and displays a window. If the window is minimized
/// or maximized, the system restores it to its original size and
/// position. An application should specify this flag when displaying
/// the window for the first …Run Code Online (Sandbox Code Playgroud) 我有一个接受 HWND 的 dll(dll 中的代码);
void VideoCapture::SetVideoWindow(HWND VidWind)
{
VideoWindow = VidWind;
}
Run Code Online (Sandbox Code Playgroud)
我通过在引用中添加 dll 在示例 c#.net 应用程序中调用上述 dll,在 c#.net 中我有一个带有面板的表单,是否可以将该面板传递给 dll?我在 C# 中给出了如下代码
VidCapWrapper.ManagedVideoCapture cc = new VidCapWrapper.ManagedVideoCapture();
cc.SetVideoWindow( panel1);
Run Code Online (Sandbox Code Playgroud)
我收到如下错误:'错误 2 'VidCapWrapper.ManagedVideoCapture.SetVideoWindow(HWND__ )'的最佳重载方法匹配有一些无效参数 D:\DirectShow_Capture_GUI\DirectShow_Capture_GUI\Form1.cs 44 13 DirectShow_Capture_GUI 错误 3 参数 1:无法转换从“System.Windows.Forms.Panel”到“HWND__ ” D:\DirectShow_Capture_GUI\DirectShow_Capture_GUI\Form1.cs 44 32 DirectShow_Capture_GUI`
任何人都可以告诉我如何将面板传递给 dll,(任何示例都会很好)?(对不起,我对 .net 很陌生,但试图创建一个示例应用程序,它显示可用的设备,如集成网络摄像头......然后在 c#.net 表单面板上显示预览)
编辑:感谢@Blachshma 和@Hans Passant,现在我可以将c# windows 窗体的面板传递给我的c++ dll。
我将 dll 中的 func 更改为
void VideoCapture::SetVideoWindow(IntPtr windowHandle)
{
VideoWindow = (HWND)windowHandle.ToPointer();
}
Run Code Online (Sandbox Code Playgroud)
在 c# 中,我将其称为 cc.SetVideoWindow(panel1.Handle);
我想获取 qml 窗口的 winId。我有以下文件。
主.qml :
import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
Window {
id: myMainWindow
title: "MyMainWindow"
width: 200
height: 200;
visible: true
Component.onCompleted: {
x = 40
y = 40
}
}
Run Code Online (Sandbox Code Playgroud)
和我的 main.cpp :
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QWindow>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<FbItem>("fbitem", 1, 0, "FbItem");
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QObject* m_rootObject = engine.rootObjects().first();
auto rect_area = m_rootObject->findChild<QWindow*>("myMainWindow"); //the id of the Window in qml
//both lines make …Run Code Online (Sandbox Code Playgroud)