Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 修改全局系统菜单_C#_Hook_Menu - Fatal编程技术网

C# 修改全局系统菜单

C# 修改全局系统菜单,c#,hook,menu,C#,Hook,Menu,在C#中是否有一种方法可以全局地将一个菜单项添加到所有活动窗口上的所有系统菜单中?也许在“最大化”命令下?这不能在托管代码中完成。即使是在没有管理的代码中,这也是非常困难的。基本上,您必须将代码注入每个进程,然后将项插入本地系统菜单,然后钩住主窗口proc以截获WM_SYSCOMMAND消息,以便使菜单项执行某些操作 只需使用FindWindow获取窗口句柄,然后使用SetWindowLong更改窗口样式,就可以编写将WS_TOPMOST样式添加到(大多数)窗口(安全性允许)的代码 但您无法将此

在C#中是否有一种方法可以全局地将一个菜单项添加到所有活动窗口上的所有系统菜单中?也许在“最大化”命令下?

这不能在托管代码中完成。即使是在没有管理的代码中,这也是非常困难的。基本上,您必须将代码注入每个进程,然后将项插入本地系统菜单,然后钩住主窗口proc以截获WM_SYSCOMMAND消息,以便使菜单项执行某些操作

只需使用
FindWindow
获取窗口句柄,然后使用
SetWindowLong
更改窗口样式,就可以编写将WS_TOPMOST样式添加到(大多数)窗口(安全性允许)的代码


但您无法将此操作的UI放入其他进程的系统菜单。

您可以通过将所有逻辑以C#形式写入exe文件来实现。您还必须在C/C++中编写一些代码作为钩子,将事件从菜单项发送到exe文件。你可以在这里找到一个例子

如果你的设计要求你这样做,你需要重新思考你的设计。我正在尝试编写一个程序,允许我“锁定”任何窗口,使其始终位于所有其他窗口之上。如果用户有另一个应用程序,该应用程序使用与你最终将窗口置于顶部相同的技术,该怎么办,谁赢了?那我就假设两扇窗户都在上面。一个可以移动到屏幕的左上角,另一个可以移动到屏幕的右下角,两者都位于所有其他窗口的顶部。感谢John的回复。因此,最好的方法是编写类似Spy++的东西,让您“选择”一个窗口,然后在该窗口上使用SetWindowLong来更改窗口样式?如果您链接到自己的项目,则需要在回答中披露这一点,这是一种不需要代码注入的优雅方法。