- 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);
}
burdakovd 17.07.2010 16:44 # 0
StringBuilder b = new StringBuilder();
for(int i = 0; i < 1024 && cname_b[i] != (char)0; ++i)
b.append(cname_b[i]);
, но как-то это сомнительно, когда для такого рода задач есть почти стандартная функция takeWhile
borka 17.07.2010 17:37 # 0
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));
}
да - и обрати внимание - теперь размер буфера указывается один раз - в его определении
burdakovd 17.07.2010 17:47 # 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);
}
Что-то подсветка в камментах не работает, есть какой-то тег?
burdakovd 17.07.2010 17:58 # 0
borka 17.07.2010 17:59 # 0
добавь при 0 == count бросание exception с информацией взятой из getLastError и будет совсем четко
есть bbcode-подсветка - я забыл тегом оформить
burdakovd 17.07.2010 18:11 # 0
А вот с substring всё же неприятно, что ненужные символы после \0 будут всё равно конвертироваться в строку, и только затем отбрасываться, ну и к тому же takeWhile работает в один проход (точнее даже в 0, так как он ленив), а indexof+substring в два.
Хотя из-за всех этих конвертаций c takeWhile получается уныло.
WebKill_HochetVBan 17.07.2010 17:51 # −2
АйАйАй. Насрал и показываешь... Как не красиво...
Lure Of Chaos 17.07.2010 19:46 # 0
Lure Of Chaos 17.07.2010 19:46 # −1
burdakovd 17.07.2010 19:49 # 0
Lure Of Chaos 17.07.2010 19:53 # −1
burdakovd 17.07.2010 20:04 # 0
По сравнению с шарпом не хватает только удобных лямбд и LINQ.
А с вызовом Win API разницы особо нет, там вызывать через P/Invoke, тут через JNA (хотя тут это сторонняя библиотека, но работает, и даже есть уже готовые интерфейсы для User32, Kernel32 и т.д.)
Lure Of Chaos 17.07.2010 20:05 # −1
borka 18.07.2010 13:57 # +1
Я как-то и с COM-объектами из java работал - ничего так, особых ужасов не заметил.
Lure Of Chaos 18.07.2010 16:36 # 0
borka 18.07.2010 21:00 # +2
Lure Of Chaos 18.07.2010 21:03 # 0
inkanus-gray 18.07.2010 21:25 # 0