[C/C++]WebKitGtk获取滚动条位置

soat7uwm  于 2023-01-10  发布在  C/C++
关注(0)|答案(1)|浏览(201)

我试图在WebKitWebView中获得滚动条的位置。我读了足够多的文档,知道没有直观的方法。
它需要打包成一个可执行文件,所以WebKitExtension不会将其删除。
我甚至不知道从哪里开始所以我不会写任何MRE
注意:如果需要的话,我可以使用JavaScript,但是我首先不知道如何与本地应用程序通信。

zvms9eto

zvms9eto1#

编辑:这个源代码很糟糕,如果你想改正它,就使用它。
好吧,你们所有的小男孩、小女孩和非欧几里德空间的生物,我来用一些美味的知识来迷惑你们悲伤、疲惫和沮丧的神经元:
我已经做到了(终于),在问了这个问题3个星期之后。我不得不使用WebKitExtension来做到这一点。让你的大脑和小脑高兴吧,这里有一个低劣的源代码:

#include <fstream>
#include <functional>
#include <webkit2/webkit-web-extension.h>
#include <JavaScriptCore/JavaScript.h>
#include <iostream>
#include <thread>
#include <filesystem>

#define SLEEP_PERIOD 5

static void save_pos(WebKitWebPage * web_page)
{
  std::ofstream tmp_file;
  tmp_file.open((std::string) std::filesystem::current_path() + "/poslck");
  tmp_file << "e";
  tmp_file.close();
  sleep(SLEEP_PERIOD + 1);
  std::filesystem::remove((std::string) std::filesystem::current_path() + "/poslck");
  WebKitDOMDocument * doc = webkit_web_page_get_dom_document(web_page);
  WebKitDOMDOMWindow * win = webkit_dom_document_get_default_view(doc);

  std::ofstream o; 

  while(true && !std::filesystem::exists((std::string) std::filesystem::current_path() + "/poslck"))
  {
    sleep(SLEEP_PERIOD);
    o.open(std::filesystem::current_path().string() + "/pos.conf");
    o <<  webkit_dom_dom_window_get_scroll_y(win);
    o.close();

  }
  
}

static void 
window_object_cleared_callback (WebKitScriptWorld *world, 
                                WebKitWebPage *web_page, 
                                WebKitFrame *frame, 
                                gpointer user_data)
{ 

  
  std::thread dothesaving(std::bind(save_pos, web_page));
  dothesaving.detach();
  
}

extern "C" G_MODULE_EXPORT void
webkit_web_extension_initialize (WebKitWebExtension *extension)
{
    std::cout << "[INFO] Extension initialized\n";
    
    g_signal_connect (webkit_script_world_get_default(),
                      "window-object-cleared", 
                      G_CALLBACK (window_object_cleared_callback), 
                      NULL);

    
}

使用以下内容编译:第一个月
另外:请查看官方文档以获得更多指导方针,从而了解如何在WebKitGTK项目中使用扩展。
在别人开始恨我之前:我使用了一些过时的函数和临时文件,原因是我不知道如何使用JavaScriptCore API(我还在看文档在哪里),也不知道如何在扩展之间通信。

相关问题