小编Dav*_*ske的帖子

是否有 Win32 API 来监视、定位和定位任务栏“通知区域”?

Windows 任务栏包含一个称为“通知区域”或“系统托盘”的区域,其中为想要在后台运行和/或显示系统通知的应用程序显示小图标。当任务栏位于屏幕底部或顶部时,此区域出现在右侧。

在多显示器设置中,即使任务栏设置为在所有显示器上显示,此“通知区域”也只会出现在其中一个任务栏上。您可以通过将任务栏拖动到您喜欢的任何显示来控制通知区域出现在哪个显示上。

我的问题是:

有没有什么直接的 API 可以找到任务栏“通知区域”的屏幕、位置和方向?

我找到了一个搜索 Shell_TrayWnd 窗口句柄的示例,然后对其位置进行数学运算,尝试找出它所处的方向(即任务栏位于屏幕的哪个边缘)。

但是,这非常脆弱,因为它取决于 Windows 任务栏的当前 UI 设计。

Windows 10 引入了一个新的通用 Toast 通知系统,包括一个时髦的通知弹出窗口。但是,即使您已将通知区域移动到不同的监视器,包括打开和关闭系统通知浮出控件的按钮,浮出控件本身仍会显示在“主监视器”上

以上表明可能没有办法做到这一点,好像微软自己的通知没有遵循通知区域,实际上可能没有办法这样做。但是,通知区域的Microsoft文档提出了一个非常明智的想法,即 toast 应该显示在它附近......我认为他们只是没有考虑多显示器的情况。

微软吐司位置指南

winapi win32gui windows-10

8
推荐指数
1
解决办法
778
查看次数

如何使用固定大小的批量通过网络代理远程.NET IEnumerable?

.NET远程处理可以为具有可序列化成员的接口生成透明代理远程控制器,例如:

public interface INetworkInterface {
  bool login(string username, string password);
  bool ExecuteSomething(string command);
}
Run Code Online (Sandbox Code Playgroud)

我想为任何IEnumerator<T>返回结果提供自定义序列化器和活动代理 - 远程处理程序.我的自定义代理远程处理器将通过网络一次处理批量特定数量的元素.例如,给定以下接口:

public interface INetworkInterface2 {
    IEnumerable<string> ExecuteSomething(string command);
}
Run Code Online (Sandbox Code Playgroud)

我想提供一个自定义的序列化程序和代理,它可以IEnumerator<T> where T:ISerializable在远程界面中出现时自动使用,并序列化IEnumerator<string>到客户端EnumeratorBatchHandlerClient<string>,它有一个.NET远程代理到服务器端EnumeratorBatchHandlerServer<string>.

我认为客户端批处理程序看起来像这样:

class EnumeratorBatchHandlerClient<T> : IEnumerable<T> {
    List<T> batched_results = new List<T>();
    EnumerableBatchHandlerServer server_proxy;    
    T cur = null;
    bool MoveNext() {
      if (batched_results.Count == 0) {
          batched_results = server_proxy.getNextBatch().ToList();
          if (batched_results.Count == 0) {
            return false;  // we are really out of results …
Run Code Online (Sandbox Code Playgroud)

c# wcf dynamic-proxy .net-remoting

5
推荐指数
0
解决办法
1069
查看次数

在 .NET Platform Invoke 中使用不安全的 struct * 作为不透明类型而不是 IntPtr 是否有效?

.NET Platform Invoke 提倡将指针类型声明为 IntPtr。例如,以下

[DllImport(“mylib”)]
静态 extern IntPtr get_foo();

[DllImport(“mylib”)]
静态 extern void do_something_foo(IntPtr foo);

然而,我发现,当与具有许多指针类型的有趣本机接口交互时,将所有内容扁平化为 IntPtr 会使代码非常难以阅读,并消除编译器可以执行的典型类型检查。

我一直在使用一种模式,将不安全的结构声明为不透明的指针类型。我可以将此指针类型存储在托管对象中,编译器可以为我对其进行类型检查。例如:

类 Foo {
   不安全的结构 FOO {};// 不透明类型
   不安全的 FOO *my_foo;

   类如果{
     [DllImport(“mydll”)]
     extern static unsafe FOO* get_foo();

     [DllImport(“mydll”)]
     extern static unsafe void do_something_foo(FOO *foo);
   }

   公共不安全 Foo() {
     this.my_foo = if.get_foo();     
   }
   公共不安全 do_something_foo() {
     if.do_something_foo(this.my_foo);
   }

注意:我并不是想整理一个结构。DLL 提供了一个不透明的指针,我不应该触及它,我只需要将它提供给将来对 DLL 的调用。

我知道已发布的执行此操作的方法是 IntPtr,但我不喜欢使用非类型化指针。当有多种指针类型在托管代码和本机代码之间移动时,使用 IntPtrs 是非常危险的。使用我的不透明结构指针类型进行类型检查是天赐之物。

我在实践中使用这种技术没有遇到任何问题。然而,我还没有看到任何人使用这种技术的例子,我想知道为什么。是否有任何原因导致上述代码在 .NET 运行时看来无效?

我的主要问题是.NET GC 系统如何处理“不安全的 FOO *my_foo”。我的希望是,因为底层类型是一个结构体,并且它被声明为不安全,所以 GC 会忽略它。

GC 系统是否会尝试跟踪该指针,或者只是忽略它?使用我的技术代替 IntPtr 安全吗?

c# pinvoke

5
推荐指数
1
解决办法
1952
查看次数

如何“替换”Chrome 文本区域中选定的文本范围?

我正在尝试使用 Javascript 来替换 Chrome 中任意选定 TEXTAREA 节点中的选定文本(!不是内容可编辑的 div !)我在很多地方看到重复的代码片段来替换选定文本基本上是这样做的:

var sel = window.getSelection();
var range = sel.getRangeAt(0);
range.insertNode( document.createTextNode("test "));
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于 TEXTAREA 或 INPUT TYPE=TEXT 等输入字段。文本被插入到 TEXTAREA 之前而不是里面。

有一种替代方法可以使用 textarea.selectionStart 和 textarea.selectionEnd 修改文本区域内的选择文本。但是,这些需要弄清楚哪个 textarea 元素实际上处于活动/选择状态。Chrome/Webkit document.activeElement 好像坏了,坏了很久了。我想不出任何解决方法来找到“当前选择的文本区域”。看到这里的错误...

http://code.google.com/p/chromium/issues/detail?id=14436

您可以在此处查看我正在尝试解决的问题的微型演示。

http://dj1.willowmail.com/~jeske/_drop/insertIssue/1.html

http://ajaxandxml.blogspot.com/2007/11/emulating-activeelement-property-with.html

对此有何想法?

给定一个在任意 TEXTAREA 节点中选择任意位文本的网页,在不提前知道焦点所在的文本区域的情况下,如何找到活动的文本区域并将所选文本替换为其他文本?

((仅供参考:我在 Chrome 扩展程序中使用此代码。页面内 javascript 内容脚本正在扩展页面 javascript,所以我不知道页面结构是什么提前。它需要适用于任何网页。 ))

javascript google-chrome contenteditable

5
推荐指数
1
解决办法
3897
查看次数