C# с использованием ImageSearch из AutoIt
Я пытаюсь использовать эту DLL из AutoIt с C# (ImageSearch)
DLL должна обнаруживать заданное изображение на экране
Это мой код:
[DllImport("ImageSearchDLL.dll")]
private static extern IntPtr ImageSearch(int x, int y, int right, int bottom, [MarshalAs(UnmanagedType.LPStr)]string imagePath);
public static String[] UseImageSearch(string imgPath)
{
int right = Screen.PrimaryScreen.WorkingArea.Right;
int bottom = Screen.PrimaryScreen.WorkingArea.Bottom;
IntPtr result = ImageSearch(0, 0, right, bottom, imgPath);
String res = Marshal.PtrToStringAnsi(result);
if (res[0] == '0') return null;//not found
String[] data = res.Split('|');
//0->found, 1->x, 2->y, 3->image width, 4->image height;
// Then, you can parse it to get x and y:
int x; int y;
int.TryParse(data[1], out x);
int.TryParse(data[2], out y);
return data;
}
Итак, я получаю System.BadImageFormatException при вызове функции ImageSearch в этой строке:
IntPtr result = ImageSearch(0, 0, right, bottom, imgPath);
Есть идеи? большое спасибо
1 ответ
У меня есть
System.BadImageFormatException
потому что я использовал 32- битную.dll, а мой проект был установлен на x64
Когда я поменял.dll на 64-битный, все заработало. Вот как я его использую (асинхронный режим):
CustomApi.cs
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace MyApp
{
public static class CustomApi
{
//The .dll must be in the same folder as the app
//You can also use [DllImport("C:\\full\\path\\to\\dll.dll")]
[DllImport("_ImageSearch_x64.dll")]
private static extern IntPtr ImageSearch(int x, int y, int right, int bottom, [MarshalAs(UnmanagedType.LPStr)] string imagePath);
public static ImageSearchResult SearchImage(string imgFullPath, int tolerance = 0)
{
//Don't delete the space
imgFullPath = $"*{tolerance} {imgFullPath}";
var result = ImageSearch(1, 1, Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height, imgFullPath);
var res = Marshal.PtrToStringAnsi(result);
if (string.IsNullOrEmpty(res) || res[0] == '0')
return null;
var data = res.Split('|');
int.TryParse(data[1], out var x);
int.TryParse(data[2], out var y);
return new ImageSearchResult(x,y);
}
}
}
ImageSearchResult.cs
namespace MyApp
{
public class ImageSearchResult
{
public int X { get; set; }
public int Y { get; set; }
public ImageSearchResult(int x, int y)
{
X = x;
Y = y;
}
}
}
MainForm.cs
public static async Task<ImageSearchResult> FindImage(string imageFullPath, int timeOut = 15)
{
return await Task.Run(() =>
{
ImageSearchResult result = null;
for (int i = 0; i < timeOut; i++)
{
result = CustomApi.SearchImage(imageFullPath, tolerance: 0);
if (result != null)
break;
Thread.Sleep(1000);
}
return result;
});
}
//Put this wherever you want
var result = await FindImage(@"C:\my_image.bmp"); //Must be .bmp
if (result == null)
Console.WriteLine("c non");
else
Console.WriteLine($"Found : X:{result.X} Y:{result.Y}");
Скачал отсюда.dll
Также на всякий случай залил в ZippyShare
Вы получаете System.BadImageFormatException
поскольку вы передаете ноль в качестве первого аргумента, это должно быть имя файла изображения.
Пример использования:
ImageSearch('checkImage.bmp', 0, 100, 500, 0)