我创建了一个全局热键来通过PInvoking显示一个窗口RegisterHotKey().但要做到这一点,我需要那个窗口HWND,在窗口加载之前不存在,这意味着第一次显示.但我不想在设置热键之前显示窗口.有没有办法创建一个HWND对用户不可见的窗口?
有人能告诉我如何在C#中获取Windows控制台应用程序的句柄吗?在Windows窗体应用程序中,我通常会尝试this.Handle.
在Java 1.4中,您可以使用((SunToolkit)Toolkit.getDefaultToolkit()).getNativeWindowHandleFromComponent()但已删除.
看起来您现在必须使用JNI来执行此操作.您是否有JNI代码和示例Java代码来执行此操作?
我需要这个来调用Win32 GetWindowLong和SetWindowLong API调用,这可以通过Jawin库完成.
我想要一些非常精确的东西,所以我可以传递对JDialog或JFrame的引用并获取窗口句柄.
使用JNI的Swing透明度可能是相关的.
使用Win32 API(在C中,但这是无关紧要的)如何判断给定窗口(由HWND标识)是否具有焦点?我正在挂钩观看活动的应用程序,当该事件发生时,我想检查应用程序是否已经有焦点.如果没有,我想要闪烁窗口,直到它们为焦点.
或者,FlashWindowEx结构标志FLASHW_TIMERNOFG闪烁,直到窗口具有焦点,如果窗口已经具有焦点,则不闪烁?我现在无法测试这个,因为我不在我的开发环境中,但我的印象是它会闪现,这正是我想要避免的.
编辑:此外,如果重要,应用程序在此窗口中使用DirectX.
我正在使用第三方类来生成Internet Explorer实例.该类有一个属性hWnd,它返回进程的hWnd.
接下来,我可能想要重用应用程序的实例(如果它仍然存在),所以我需要告诉我的帮助程序类附加到它.在此之前,我想知道给定的hWnd是否仍然有效,否则我将生成另一个实例.
我怎样才能在C#和.NET 3.5中做到这一点?
从几个初步测试开始,似乎EnumWindows总是以反向实例化顺序返回窗口,即最近实例化的窗口.这是一个有效的观察吗?如果是这样,在所有版本的Windows中都是如此吗?这是一个可靠的假设,即某种行为记录在哪里?
上下文:我正在处理我触发第三方应用程序打开几个非模态窗口的情况,我需要在打开后向这些窗口发送一些窗口消息,但我没有确定的方式鉴定它们的窗口类别和它们的标题都不会有所不同,我也不知道它们的预期坐标.但是,如果我可以依赖上面的行为,EnumWindows我可以简单地使用返回的第一个句柄,EnumWindows其类和标题符合我的期望.这仍然留下一些假设的循环漏洞,但我认为这将是足够好的.尽管如此,欢迎另类建议.
我有一个类(TObject):
private
FHwnd : HWND;
procedure HandleMyMessage(var Message : TMessage); message TH_MYMESSAGE;
Run Code Online (Sandbox Code Playgroud)
哪里 TH_MYMESSAGE = WM_USER + 1
在类构造函数中:
FHwnd := AllocateHWND(HandleMyMessage);
Run Code Online (Sandbox Code Playgroud)
接收引用的唯一对象FHwnd是私有自定义TThread(在此类中创建)以及它发布的唯一消息TH_MYMESSAGE.我的理解是,message程序声明中的指令仅限制其处理TH_MYMESSAGE.
这在测试中运行良好,但是在集成到更大的应用程序中时,我得到的反馈HandleMyMessage也会触发其他消息(显然有不希望的结果).
这可以通过添加if Message.Msg <> TH_MYMESSAGE then Exit;来轻松纠正HandleMyMessage.我的问题是:为什么会这样?
我最好的猜测是,AllocateHWND已经取得HandleMyMessage的等效DefWndProc尽管拥有它message的指令.有没有正确的方法来实现我缺少的?
我正在尝试使用功能SetForegroundWindow(HWND hWnD).我有一些句柄,但它不作为上述功能的参数.我的句柄是一个线程,我想在前台运行它.
HWND和HANDLE之间有什么区别?
我已经能够像这样设置本地热键
RegisterHotKey(hwndDlg, 100, MOD_ALT | MOD_CONTROL, 'S');
Run Code Online (Sandbox Code Playgroud)
如何将热键设置为全局?即使我的窗户被隐藏,我希望它在那里.
我有一个自定义方法,找到用于给定字符串和字体的最大大小,以填充给定的框而不切断文本.为了测试它,我创建了一个服务,它循环遍历几个不同的字符串和几个不同的字体,并在Parallel.For循环中完成批量处理.运行此服务时,系统上的所有CPU核心均为%90-%100.运行8或9小时后,它将开始抛出异常.它大部分时间仍然可以工作,但会偶尔出现异常或异常突发.
最里面的异常具有消息"操作已成功完成",并且源自FormattedText对象上的WidthIncludingTrailingWhitespace访问器.调用堆栈如下所示:
at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)
at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
at System.Windows.Threading.Dispatcher..ctor()
at System.Windows.Threading.Dispatcher.get_CurrentDispatcher()
at System.Windows.Media.TextFormatting.TextFormatter.FromCurrentDispatcher(TextFormattingMode textFormattingMode)
at System.Windows.Media.FormattedText.LineEnumerator..ctor(FormattedText text)
at System.Windows.Media.FormattedText.DrawAndCalculateMetrics(DrawingContext dc, Point drawingOffset, Boolean getBlackBoxMetrics)
at System.Windows.Media.FormattedText.get_Metrics()
at System.Windows.Media.FormattedText.get_WidthIncludingTrailingWhitespace()
...My Library Here...
Run Code Online (Sandbox Code Playgroud)
在研究这个时,我发现未使用的绘图对象(图形,图标等)是这个的常见原因,但是我找不到任何正在使用的Disposable对象.文本大小调整代码使用WPF类(FontFamily,FormattedText和Typeface),但它们都没有实现IDisposable.
我有perfmon监视进程,虽然内存使用,句柄计数和线程数确实变化很大,但它们从未飙升失控.这告诉我它可能不是手柄泄漏.还有什么呢?
更新:我已经运行了几天的测试,但有一个重大变化:它正在进行常规而不是并行.它尚未崩溃,perfmon显示水平线,方差很小.也许这是并行化而不是WPF文本呈现的问题?