Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

建议把kernel启动参数加入工作空间路径或者把它写入到用户配置目录 #13300

Closed
wish5115 opened this issue Nov 28, 2024 · 21 comments
Assignees

Comments

@wish5115
Copy link

wish5115 commented Nov 28, 2024

In what scenarios do you need this feature?

千言万语不如一张图,如下
image

有时,需要用脚本获取当前进程的工作空间,但是默认的kernel进程,即监听6806端口的那个进程的启动参数中没有工作空间路径。

这样就无法获取,必须遍历所有的工作空间,然后去工作空间的siyuan.log启动日志中匹配到pid对应的工作空间路径。

这样效率太低了,如果能在kernel启动参数中含有或者能把kernel启动基本信息实时写入到用户配置目录就好了。

非6806端口监听的那个内核的工作空间是有的,就第一个启动的工作空间内核没有。

或者请教 @88250 不知道还有没有其他获取方法?通过内核pid获取到工作空间路径。

Describe the optimal solution

期望所有的内核启动参数都带上工作空间路径。

Describe the candidate solution

No response

Other information

No response

@AdachiQ
Copy link

AdachiQ commented Nov 28, 2024

https://getquicker.net/subprogram?id=6f766c2d-69a9-475a-1e4d-08db54f2077f
你可以参考下,仅适用于Windows平台,其他平台不确定是否有这些文件

@wish5115
Copy link
Author

wish5115 commented Nov 28, 2024

https://getquicker.net/subprogram?id=6f766c2d-69a9-475a-1e4d-08db54f2077f 你可以参考下,仅适用于Windows平台,其他平台不确定是否有这些文件

感谢提供的建议!

我是参考了这个动作后才来提建议的,这个动作中是通过提取用户配置目录下的workspace.json文件中的最后一个工作空间来实现的,这最后一个工作空间是最后打开的工作空间,虽然基本上覆盖大部分用户的情况,但这样判断这是不精确的。

比如,我打开了A工作空间,又打开了B工作空间,这时候关闭了B工作空间,workspace.json文件中的最后一个工作空间还是B工作空间;即使不关闭B工作空间,我在A工作空间操作,获取的结果也还是B工作空间。

这种方式只能覆盖平时只操作一个工作空间的情况,且没有频繁打开和关闭。

@88250
Copy link
Member

88250 commented Nov 29, 2024

你目前最方便获取到的是 port 吗?

@wish5115
Copy link
Author

你目前最方便获取到的是 port 吗?

是的,ip和端口,进程id可以通过窗口信息获取。

@88250
Copy link
Member

88250 commented Nov 29, 2024

我们加个获取系统信息的内核接口吧?

@wish5115
Copy link
Author

wish5115 commented Nov 29, 2024

我们加个获取系统信息的内核接口吧?

这里,之所以拿这个工作空间路径其实是想直接获取token,如果不是获取token,仅仅需要工作空间的话,其实可以通过 /api/system/getConf这个api获取到的。

接口的话,如果不鉴权还好,不知道是否安全,鉴权的话就获取不到了。

而放到用户配置目录中或启动进程参数中,因为仅存在本地可能大概也许会安全些吧。

@88250
Copy link
Member

88250 commented Nov 29, 2024

对于这个接口,来自本地的请求会跳过鉴权检查,这样不影响安全性。

/api/system/getWorkspaceInfo

{
    "code": 0,
    "msg": "",
    "data": {
        "workspaceDir": "F:\\SiYuan"
    }
}

@wish5115
Copy link
Author

对于这个接口,来自本地的请求会跳过鉴权检查,这样不影响安全性。

/api/system/getWorkspaceInfo

{
    "code": 0,
    "msg": "",
    "data": {
        "workspaceDir": "F:\\SiYuan"
    }
}

👍 这样可以,这是通过端口获取吗?

@88250
Copy link
Member

88250 commented Nov 29, 2024

是的,内核 HTTP 接口。

@88250 88250 closed this as completed Nov 29, 2024
@88250 88250 self-assigned this Nov 29, 2024
@wish5115
Copy link
Author

是的,内核 HTTP 接口。

666 🌹🌹🌹

@wish5115
Copy link
Author

是的,内核 HTTP 接口。

建议最好带上版本信息,方便针对不同版本做一些兼容性处理。不过这个目前可以通过用户配置目录的app.log中匹配。

@AdachiQ
Copy link

AdachiQ commented Nov 29, 2024

对于这个接口,来自本地的请求会跳过鉴权检查,这样不影响安全性。

/api/system/getWorkspaceInfo

{
    "code": 0,
    "msg": "",
    "data": {
        "workspaceDir": "F:\\SiYuan"
    }
}

@88250 也返回一下对应窗口的句柄吧,打开多工作空间的时候获取句柄可太难了,主要是不准

@88250
Copy link
Member

88250 commented Nov 29, 2024

@AdachiQ 窗口信息内核获取不到

@88250
Copy link
Member

88250 commented Nov 29, 2024

{
    "code": 0,
    "msg": "",
    "data": {
        "siyuanVer": "3.1.13",
        "workspaceDir": "F:\\SiYuan"
    }
}

@AdachiQ
Copy link

AdachiQ commented Nov 29, 2024

你目前最方便获取到的是 port 吗?

是的,ip和端口,进程id可以通过窗口信息获取。

@wish5115 如果你要在打开多个工作空间的情况下,将端口、工作空间路径、窗口三者统一的话,目前是无解的,我猜测你应该是要通过窗口标题来和工作空间名称来匹配,但是:

  • 我打开了两个同名工作空间,如何应对?
  • 安装了knote的插件的话,会有个和工作空间同名的窗口,如何获取到主窗口的句柄?
  • 窗口关闭到托盘的话,获取到的句柄无法操作窗口,甚至好像没有句柄?如何应对?
    窗口太难弄了
    @88250 有什么建议吗?

@88250
Copy link
Member

88250 commented Nov 29, 2024

我不太清楚你们要干嘛 😂

@AdachiQ
Copy link

AdachiQ commented Nov 29, 2024

我不太清楚你们要干嘛 😂

@88250 我主要是获取当前思源窗口或者最后使用的思源窗口,然后匹配内核(窗口名称=工作空间名称,内核和工作空间的匹配比较简单),再使用quicker和内核进行通信。
windows可以获取到siyuan.exe的所有句柄,排在最前面的句柄就是最后使用的窗口,但是这些句柄和内核的匹配比较困难。
#12656 如果把这个issue解决了应该也能通过运行js代码解决匹配的问题。

@wish5115
Copy link
Author

wish5115 commented Nov 29, 2024

建议最好带上版本信息,方便针对不同版本做一些兼容性处理。不过这个目前可以通过用户配置目录的app.log中匹配。

/api/system/version @88250 抱歉,获取版本信息已经有这个api了,不需要带版本了。

@wish5115
Copy link
Author

wish5115 commented Nov 29, 2024

我不太清楚你们要干嘛 😂

@88250 我主要是获取当前思源窗口或者最后使用的思源窗口,然后匹配内核(窗口名称=工作空间名称,内核和工作空间的匹配比较简单),再使用quicker和内核进行通信。 windows可以获取到siyuan.exe的所有句柄,排在最前面的句柄就是最后使用的窗口,但是这些句柄和内核的匹配比较困难。 #12656 如果把这个issue解决了应该也能通过运行js代码解决匹配的问题。

@AdachiQ 我是通过前台窗口获取,当前正在操作的思源窗口对应的pid,端口,工作空间等,没太懂你的获取方式?
你是不通过前台窗口,直接获取思源所有窗口及对应的内核信息吗?

@AdachiQ
Copy link

AdachiQ commented Nov 29, 2024

我不太清楚你们要干嘛 😂

@88250 我主要是获取当前思源窗口或者最后使用的思源窗口,然后匹配内核(窗口名称=工作空间名称,内核和工作空间的匹配比较简单),再使用quicker和内核进行通信。 windows可以获取到siyuan.exe的所有句柄,排在最前面的句柄就是最后使用的窗口,但是这些句柄和内核的匹配比较困难。 #12656 如果把这个issue解决了应该也能通过运行js代码解决匹配的问题。

@AdachiQ 我是通过前台窗口获取,当前正在操作的思源窗口对应的pid,端口,工作空间等,没太懂你的获取方式? 你是不通过前台窗口,直接获取思源所有窗口及对应的内核信息吗?

如果能保证当前窗口是思源的话,那太简单了,下面这种方式就能直接知道当前窗口对应哪个端口了。
image

下面这种动作的当前窗口是浏览器,就比较麻烦。假设我开了两个思源,要将数据发送到最后使用的思源,就麻瓜了
https://getquicker.net/Sharedaction?code=9736e7c1-c500-4588-ffa3-08dcb1b1f7f4&fromMyShare=true

@wish5115
Copy link
Author

wish5115 commented Nov 29, 2024

我不太清楚你们要干嘛 😂

@88250 我主要是获取当前思源窗口或者最后使用的思源窗口,然后匹配内核(窗口名称=工作空间名称,内核和工作空间的匹配比较简单),再使用quicker和内核进行通信。 windows可以获取到siyuan.exe的所有句柄,排在最前面的句柄就是最后使用的窗口,但是这些句柄和内核的匹配比较困难。 #12656 如果把这个issue解决了应该也能通过运行js代码解决匹配的问题。

@AdachiQ 我是通过前台窗口获取,当前正在操作的思源窗口对应的pid,端口,工作空间等,没太懂你的获取方式? 你是不通过前台窗口,直接获取思源所有窗口及对应的内核信息吗?

如果能保证当前窗口是思源的话,那太简单了,下面这种方式就能直接知道当前窗口对应哪个端口了。 image

下面这种动作的当前窗口是浏览器,就比较麻烦。假设我开了两个思源,要将数据发送到最后使用的思源,就麻瓜了 https://getquicker.net/Sharedaction?code=9736e7c1-c500-4588-ffa3-08dcb1b1f7f4&fromMyShare=true

明白了,这种场景确实不好搞,我测试了下,获取所有顶层窗口的句柄,然后用FlaUI获取/Document控件的值(即ip和端口),如果获取的值是空值的就是多余的句柄,如果第一个不为空的就是最后使用的窗口句柄,然后通过这个ip和端口就可以发送了。

但,问题是,如果最小化,关闭到托盘或窗口隐藏情况下,就获取不到控件信息了,这个目前不知道怎么解决?如果通过先激活窗口再获取,最小化和隐藏的还可以,但关闭到托盘的窗口无法激活窗口,尝试了社区里几个模拟鼠标点击托盘的都不管用。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants