我想知道如何基于 X、Y 鼠标坐标在 android 上执行拖动?考虑两个简单的例子,Team Viewer/QuickSupport分别在远程智能手机和Windows Paint的Pen上绘制“密码模式”。
我所能做的就是模拟触摸(使用dispatchGesture()和AccessibilityNodeInfo.ACTION_CLICK)。
我找到了这些相关链接,但不知道它们是否有用:
下面是我的工作代码,用于将鼠标坐标(在PictureBox控制范围内)发送到远程电话并模拟触摸。
Windows 窗体应用程序:
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
foreach (ListViewItem item in lvConnections.SelectedItems)
{
// Remote screen resolution
string[] tokens = item.SubItems[5].Text.Split('x'); // Ex: 1080x1920
int xClick = (e.X * int.Parse(tokens[0].ToString())) / (pictureBox1.Size.Width);
int yClick = (e.Y * int.Parse(tokens[1].ToString())) / (pictureBox1.Size.Height);
Client client = (Client)item.Tag;
if (e.Button == MouseButtons.Left)
client.sock.Send(Encoding.UTF8.GetBytes("TOUCH" + xClick + "<|>" + …Run Code Online (Sandbox Code Playgroud) 从以下C ++代码开始的for循环中,Delphi中的等效项是什么ChildWindowFromPoint():
HWND hWnd;
POINT point;
...
for (HWND currHwnd = hWnd;;)
{
hWnd = currHwnd;
ScreenToClient(currHwnd, &point);
currHwnd = ChildWindowFromPoint(currHwnd, point);
if (!currHwnd || currHwnd == hWnd)
break;
}
Run Code Online (Sandbox Code Playgroud)
我的尝试是这样,但我不确定是否正确:
var
hWndWindow, currHwnd: HWND;
MousePoint: TPoint;
...
while True do
begin
currHwnd := hWndWindow;
hWndWindow := currHwnd;
ScreenToClient(currHwnd, MousePoint);
currHwnd := ChildWindowFromPoint(currHwnd, MousePoint);
if (currHwnd = 0) or (currHwnd = hWndWindow) then
Break;
end;
Run Code Online (Sandbox Code Playgroud) 我有一个Java android代码,它将数据(图像或文本)发送到C#应用程序,以接收我正在使用异步套接字的这些数据。但是存在一个与BeginReceive()功能有关的问题,就是在发送图像时没有接收到完整的数据。那么,如何使一种“循环”来接收完整的数据并在Picturebox上显示图像之后(例如)?
形成
private Listener listener;
private Thread startListen;
private Bitmap _buffer;
public frmMain()
{
InitializeComponent();
}
private void serverReceivedImage(Client client, byte[] image)
{
try
{
byte[] newImage = new byte[image.Length - 6];
Array.Copy(image, 6, newImage, 0, newImage.Length);
using (var stream = new MemoryStream(newImage))
{
using (var msInner = new MemoryStream())
{
stream.Seek(2, SeekOrigin.Begin);
using (DeflateStream z = new DeflateStream(stream, CompressionMode.Decompress))
{
z.CopyTo(msInner);
}
msInner.Seek(0, SeekOrigin.Begin);
var bitmap = new Bitmap(msInner); …Run Code Online (Sandbox Code Playgroud) 下面的C代码如何在Delphi中完成?我尝试翻译,但似乎Delphi不允许使用此语法。基本上,我需要像在C代码中那样将函数分配给变量。在Delphi上怎么做?
这是参考的C代码:
void EnumWindowsTopToDown(HWND owner, WNDENUMPROC proc, LPARAM param)
{
HWND currentWindow = GetTopWindow(owner);
if (currentWindow == NULL)
return;
if ((currentWindow = GetWindow(currentWindow, GW_HWNDLAST)) == NULL)
return;
while (proc(currentWindow, param) && (currentWindow = GetWindow(currentWindow, GW_HWNDPREV)) != NULL);
}
Run Code Online (Sandbox Code Playgroud)
这是我的尝试:
type
TFNWndEnumProc = function(_hwnd: HWND; _lParam: LPARAM): BOOL; stdcall;
procedure EnumWindowsTopToDown(Owner: HWND; Proc: TFNWndEnumProc;
_Param: LPARAM);
var
CurrentWindow: HWND;
begin
CurrentWindow := GetTopWindow(Owner);
if CurrentWindow = 0 then
Exit;
CurrentWindow := GetWindow(CurrentWindow, GW_HWNDLAST);
if CurrentWindow = 0 then
Exit;
while Proc(CurrentWindow, …Run Code Online (Sandbox Code Playgroud) 我已按照此建议以编程方式卸载我的应用程序,并且在 Android 7.1 之前一切正常,但是当我在 Android 8.1 和 9 上测试相同时,这似乎不起作用(在 Ui 窗口上没有执行任何点击)。发生了什么?在这些版本中对此进行了一些更新吗?
主要代码 >
我的可访问性:
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source == null) {
return;
}
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByViewId("android:id/button1");
for (AccessibilityNodeInfo node : list) {
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
}
Run Code Online (Sandbox Code Playgroud)
XML(主要):
<service
android:name=".MyAccessibility"
class=".MyAccessibility"
android:enabled="true"
android:exported="false"
android:label="@string/accessibility_service_label"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action
android:name=".MyAccessibility"
android:value=".MyAccessibility" />
</intent-filter>
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" />
</service>
Run Code Online (Sandbox Code Playgroud)
XML(无障碍服务):
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service …Run Code Online (Sandbox Code Playgroud) android accessibilityservice android-8.1-oreo android-9.0-pie
我陷入了编译器说的麻烦:
不兼容的类型:“ AnsiChar”和“ Integer”
到AnsiChar数组的最后一个元素,它是一个整数,它是一个空终止。如何解决?
C ++代码:
static const BYTE myarray[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 0 };
SOCKET s;
// Usage example:
if(Send(s, (char *) myarray, sizeof(myarray), 0) <= 0)
return;
Run Code Online (Sandbox Code Playgroud)
我在Delphi中的尝试:
var
MyArray: array [0 .. MAX_PATH] of AnsiChar = ( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 0 );
S: TSocket;
// Usage example:
send(S, MyArray, Length(MyArray), 0);
Run Code Online (Sandbox Code Playgroud) 我使用下面的代码通过递归复制文件夹。工作正常,但至少对我来说还是存在问题,因为复制后源文件夹标签也包含在dest文件夹中,我不想要它。在这一刻发生了什么:
SRC文件夹:
C:\MyTest
-firstfolder
-secondfolder
-- secondfolderFile
Run Code Online (Sandbox Code Playgroud)
DEST文件夹(复制后):
C:\NewTest
-MyTest
-firstfolder
-secondfolder
-- secondfolderFile
Run Code Online (Sandbox Code Playgroud)
然后我需要在dest文件夹中仅保留:
C:\NewTest
-firstfolder
-secondfolder
-- secondfolderFile
Run Code Online (Sandbox Code Playgroud)
如何使用以下代码做到这一点?
program testCopyRecursion;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Windows,
ShellAPI,
SysUtils;
function CopyFolder(const SrcFolder, DestFolder: String; iFileOp: Integer;
OverWrite: Boolean; ShowDialog: Boolean): Boolean;
var
MyFOStruct: TSHFileOpStruct;
Src, Dest: String;
ResultVal: Integer;
begin
Result := False;
Src := SrcFolder;
Dest := DestFolder;
if not DirectoryExists(Dest) then
ForceDirectories(Dest);
if (Src = '') or ((iFileOp <> FO_DELETE) and (Dest = '')) or
(CompareText(Src, …Run Code Online (Sandbox Code Playgroud) 我有两个文件,想要比较您的编译日期以供将来更新。
假设新文件的日期为20/09/2019,旧文件的日期为19/09/2019。如何以相同格式(dd / mm / yyyy)比较这两个日期?
var
UpDate, OldDate: string;
begin
UpDate := '20/09/2019';
OldDate := DateToStr(FileDateToDateTime(FileAge(IncludeTrailingBackslash(ExtractFilePath(Application.ExeName)) + 'test.exe'))) // 19/09/2019
if UpDate > OldDate then
begin
// Do something
end;
end;
Run Code Online (Sandbox Code Playgroud) 我有一个Timer,想要向每个客户端发送一条消息ListView,例如确定ping时间。然后我有以下代码:
procedure TMainForm.Timer1Timer(Sender: TObject);
var
i: Integer;
begin
try
for i := 0 to ListView1.Items.count - 1 do
begin
ListView1.Items.Item[i].SubItems.Objects[2] := TObject(GetTickCount);
ServerSocket1.Socket.Connections[i].SendText('ping' + #13#10);
end;
except
exit;
end;
end;
Run Code Online (Sandbox Code Playgroud)
在发送之前,可以更适当地检查客户端是否已真正连接或类似的连接。怎么做?提前致谢。
我需要帮助将LPARAM类型转换为Structure。例如,在C ++中,我们有:
struct MyStructure
{
int data01;
int data02;
};
BOOL CALLBACK CallbackProc(int number, LPARAM param)
{
MyStructure *myStruct = (MyStructure *) param;
}
Run Code Online (Sandbox Code Playgroud)
在Delphi中,我尝试了此操作,但是编译器在注释行中以突出显示的行给出了不兼容类型的错误:
type
TMyStructure = record
data01: Integer;
data02: Integer;
end;
PMyStructure = ^TMyStructure;
function CallbackProc(number: Integer; param: LPARAM): BOOL; stdcall;
var
myStruct: TMyStructure;
begin
myStruct := param; // How stays here?
end;
Run Code Online (Sandbox Code Playgroud) delphi ×7
android ×2
c# ×2
sockets ×2
arrays ×1
asyncsocket ×1
beginreceive ×1
date ×1
java ×1