我找到了這篇文章并嘗試按照它來查找插入符號在任何 Windows 應用程式中的位置:
如何從 C# 獲得任何應用程式中的插入符號位置?
但是,我在關注它時遇到了問題。
這是我關注的 C# 代碼:
var guid = typeof(IAccessible).GUID;
object accessibleObject = null;
var retVal = WinApiProvider.AccessibleObjectFromWindow(hwnd, WinApiProvider.OBJID_CARET, ref guid, ref accessibleObject);
var accessible = accessibleObject as IAccessible;
accessible.accLocation(out int left, out int top, out int width, out int height, WinApiProvider.CHILDID_SELF);
但我不知道如何放入函式CHILDID_SELF的第五個引數IAccessible::accLocation():
Rect rect;
VARIANT varCaret;
varCaret.vt = VT_I4;
varCaret.lVal = CHILDID_SELF;
std::cout << object->accLocation(&rect.x, &rect.y, &rect.w, &rect.h, varCaret);
經過一番研究,我發現我應該CHILDID_SELF這樣放。但它沒有按預期作業。
我認為這應該能夠在 Microsoft Edge 或 Chrome 中獲得插入符號的位置,但它只是回傳S_FALSE.
鏈接中的人也沒有從 Chrome 或其他視窗中獲得插入符號的位置,但在添加CHILDID_SELF. 所以,我想我遇到的問題與我使用的方式有關CHILDID_SELF。
我也在使用 21H1 build 19043.1889,但我仍然使用 21H1,所以在我看來這應該不是問題。
我也嘗試將其插入,但當然 C 不允許我這樣做:
object->accLocation(&rect.x, &rect.y, &rect.w, &rect.h, CHILDID_SELF);
object->accLocation(&rect.x, &rect.y, &rect.w, &rect.h, (VARIANT)CHILDID_SELF);
這個問題的解決方案是什么?難道我做錯了什么?
完整代碼
#include <iostream>
#include <Windows.h>
#include <oleacc.h>
#pragma comment(lib, "Oleacc.lib")
typedef struct {
long x;
long y;
long w;
long h;
} Rect;
int main(int argc, char* argv[]) {
HWND hwnd;
DWORD pid;
DWORD tid;
while (true) {
system("cls");
GUITHREADINFO info;
info.cbSize = sizeof(GUITHREADINFO);
hwnd = GetForegroundWindow();
tid = GetWindowThreadProcessId(hwnd, &pid);
GetGUIThreadInfo(tid, &info);
IAccessible* object = nullptr;
if (SUCCEEDED(AccessibleObjectFromWindow(info.hwndFocus, OBJID_CARET, IID_IAccessible, (void**)&object))) {
Rect rect;
VARIANT varCaret;
varCaret.vt = VT_I4;
varCaret.lVal = CHILDID_SELF;
object->accLocation(&rect.x, &rect.y, &rect.w, &rect.h, varCaret);
std::cout << rect.x << std::endl;
object->Release();
}
Sleep(10);
}
return 0;
}
使用 Microsoft Visual Studio 2019, x86, Debug 構建
uj5u.com熱心網友回復:
根據檔案,您的第一個代碼片段是傳遞引數CHILDID_SELF的 正確方法 :VARIANT
子 ID 如何在引數中使用
初始化引數時, 除了 在 成員中指定子 ID 值(或) 外,請
VARIANT務必在成員中指定 。VT_I4vtCHILDID_SELFlVal
所以,問題一定是別的。例如,我注意到的一件事是您在呼叫AccessibleObjectFromWindow(). 試著 CoInitialize/Ex() 先打電話,看看有沒有什么不同。
accLocation()此外,在使用 RECT 坐標之前,您不會檢查失敗的回傳值 。
嘗試這個:
#include <iostream>
#include <Windows.h>
#include <oleacc.h>
#pragma comment(lib, "Oleacc.lib")
typedef struct {
long x;
long y;
long w;
long h;
} Rect;
int main(int argc, char* argv[]) {
HWND hwnd;
DWORD pid;
DWORD tid;
CoInitialize(nullptr); // <-- add this
while (true) {
system("cls");
GUITHREADINFO info;
info.cbSize = sizeof(GUITHREADINFO);
hwnd = GetForegroundWindow();
tid = GetWindowThreadProcessId(hwnd, &pid);
GetGUIThreadInfo(tid, &info);
IAccessible* object = nullptr;
if (SUCCEEDED(AccessibleObjectFromWindow(info.hwndFocus, OBJID_CARET, IID_IAccessible, (void**)&object))) {
Rect rect;
VARIANT varCaret;
varCaret.vt = VT_I4;
varCaret.lVal = CHILDID_SELF;
if (SUCCEEDED(object->accLocation(&rect.x, &rect.y, &rect.w, &rect.h, varCaret))) {
std::cout << rect.x << std::endl;
}
object->Release();
}
Sleep(10);
}
CoUninitialize(); // <-- add this
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/512754.html
標籤:C 温纳皮
