- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
public static String getClassName(final HWND hWnd) {
final char[] cname_b = new char[1024];
User32.INSTANCE.GetClassName(hWnd, cname_b, 1000);
final char[] cname_b_truncated = ArrayUtils.toPrimitive(Iterables
.toArray(Functional.takeWhile(Arrays.asList(ArrayUtils
.toObject(cname_b)), Predicates.not(Predicates
.equalTo(Character.valueOf((char) 0)))),
Character.class));
return String.valueOf(cname_b_truncated);
}
StringBuilder b = new StringBuilder();
for(int i = 0; i < 1024 && cname_b[i] != (char)0; ++i)
b.append(cname_b[i]);
, но как-то это сомнительно, когда для такого рода задач есть почти стандартная функция takeWhile
public static String getClassName(final HWND hWnd) {
final char[] cname_b = new char[1024];
User32.INSTANCE.GetClassName(hWnd, cname_b, cname_b.length);
final String result = new String(b);
return result.substring(0, result.indexOf(0));
}
да - и обрати внимание - теперь размер буфера указывается один раз - в его определении
Ну и ещё что-то завтыкал, что "If the function succeeds, the return value is the number of characters copied to the specified buffer.", то есть количество символов заранее известно, тогда вообще всё упрощается.
public static String getClassName(final HWND hWnd) {
final char[] cname_b = new char[1024];
final int count = User32.INSTANCE.GetClassName(hWnd, cname_b, 1000);
return new String(cname_b, 0, count);
}
Что-то подсветка в камментах не работает, есть какой-то тег?
добавь при 0 == count бросание exception с информацией взятой из getLastError и будет совсем четко
есть bbcode-подсветка - я забыл тегом оформить
А вот с substring всё же неприятно, что ненужные символы после \0 будут всё равно конвертироваться в строку, и только затем отбрасываться, ну и к тому же takeWhile работает в один проход (точнее даже в 0, так как он ленив), а indexof+substring в два.
Хотя из-за всех этих конвертаций c takeWhile получается уныло.
АйАйАй. Насрал и показываешь... Как не красиво...
По сравнению с шарпом не хватает только удобных лямбд и LINQ.
А с вызовом Win API разницы особо нет, там вызывать через P/Invoke, тут через JNA (хотя тут это сторонняя библиотека, но работает, и даже есть уже готовые интерфейсы для User32, Kernel32 и т.д.)
Я как-то и с COM-объектами из java работал - ничего так, особых ужасов не заметил.