Прикрепление JAVA-приложения к панели задач Windows 7

Да, можно связаться с определенными страницами числом или названными местоположениями, и это будет всегда работать , если браузер пользователя будет использовать Adobe Reader в качестве плагина для просмотра файлов .

PDF

Для определенной страницы числом:

<a href="http://www.domain.com/file.pdf#page=3">Link text</a>

Для именованного местоположения (место назначения):

<a href="http://www.domain.com/file.pdf#nameddest=TOC">Link text</a>


Для создания мест назначения в PDF с Acrobat:

  1. Вручную перешли через PDF для желаемого местоположения
  2. , Переходят к Представлению> Вкладки Навигации> Места назначения
  3. Под Опциями, выбирают Scan Document
  4. Once, это завершается, выберите Новое Место назначения из меню параметров и введите соответствующее имя
35
задан Community 23 May 2017 в 12:10
поделиться

4 ответа

У меня нет Windows 7, но вот кое-что, что может помочь вам начать:

Со стороны Java:

package com.stackoverflow.homework;

public class MyApplication
{
  static native boolean setAppUserModelID();

  static
  {
    System.loadLibrary("MyApplicationJNI");
    setAppUserModelID();
  }
}

А с нативной стороны, в исходном коде Библиотека MyApplicationJNI.dll:

JNIEXPORT jboolean JNICALL Java_com_stackoverflow_homework_MyApplication_setAppUserModelID(JNIEnv* env)
{
  LPCWSTR id = L"com.stackoverflow.homework.MyApplication";
  HRESULT hr = SetCurrentProcessExplicitAppUserModelID(id);

  return hr == S_OK;
}

Ваш вопрос явно задан для решения JNI. Однако, поскольку вашему приложению не нужен какой-либо другой собственный метод, jna - еще одно решение, которое избавит вас от написания собственного кода только ради перенаправления на API Windows. Если вы решили использовать jna, обратите внимание на тот факт, что SetCurrentProcessExplicitAppUserModelID () ожидает строку UTF-16.

Когда он работает в вашей песочнице, следующим шагом будет добавление обнаружения операционной системы в ваше приложение как SetCurrentProcessExplicitAppUserModelID () очевидно доступно только в Windows 7:

  • вы можете сделать это со стороны Java, проверив, что System.getProperty ("os.name"); возвращает "Windows 7" .
  • если вы собираете из небольшой фрагмент JNI, который я дал, вы можете улучшить его, динамически загружая библиотеку shell32.dll с помощью LoadLibrary , а затем возвращая указатель функции SetCurrentProcessExplicitAppUserModelID с помощью GetProcAddress . Если GetProcAddress возвращает NULL , это означает, что символ отсутствует в shell32 , следовательно, это не Windows 7.

РЕДАКТИРОВАТЬ: Решение JNA ].

Ссылки:

21
ответ дан 27 November 2019 в 15:41
поделиться

SetCurrentProcessExplicitAppUserModelID (или SetAppID ()) на самом деле будет делать то, что вы пытаетесь сделать. Однако может быть проще изменить установщик, задав свойство AppUserModel.ID в вашем ярлыке - цитируя из упомянутого выше документа Application User Model ID :

В System.AppUserModel. ID файла ярлыка приложения. Ярлык (в виде IShellLink, CLSID_ShellLink или файла .lnk) поддерживает свойства через IPropertyStore и другие механизмы установки свойств, используемые в командной консоли. Это позволяет панели задач определить правильный ярлык для закрепления и гарантирует, что окна, принадлежащие процессу, соответствующим образом связаны с этой кнопкой панели задач. Примечание. Свойство System.AppUserModel.ID следует применять к ярлыку при создании этого ярлыка. При использовании установщика Microsoft Windows (MSI) для установки приложения таблица MsiShortcutProperty позволяет применить AppUserModelID к ярлыку, когда он создается во время установки.

3
ответ дан 27 November 2019 в 15:41
поделиться

Попробуйте использовать JSmooth . Я всегда использую этот. В JSmooth есть опция в разделе Скелет от Windowed Wrapper , вызываемая

Приложение Java Lauch в процессе exe

См. На этом изображении.

JSmooth

Также могут быть аргументы командной строки прошло.
Думаю, это может быть для вас решением.

Мартин

4
ответ дан 27 November 2019 в 15:41
поделиться

Я реализовал доступ к методу SetCurrentProcessExplicitAppUserModelID с помощью JNA и он работает достаточно хорошо при использовании, как предполагает документация MSDN. Я никогда не использовал JNA api так, как Вы используете в своём фрагменте кода. Вместо этого моя реализация следует типичному использованию JNA.

Сначала определение интерфейса Shell32:

interface Shell32 extends StdCallLibrary {

    int SetCurrentProcessExplicitAppUserModelID( WString appID );

}

Затем использование JNA для загрузки Shell32 и вызова функции:

final Map<String, Object> WIN32API_OPTIONS = new HashMap<String, Object>() {
    {
       put(Library.OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.UNICODE);
       put(Library.OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE);
    }
};
Shell32 shell32 = (Shell32) Native.loadLibrary("shell32", Shell32.class,
           WIN32API_OPTIONS);
WString wAppId = new WString( "Vendor.MyJavaApplication" );
shell32.SetCurrentProcessExplicitAppUserModelID( wAppId );

Многие из API в последней упомянутой Вами статье используют Windows COM, который довольно сложно использовать непосредственно с JNA. Я успешно создал пользовательский DLL для вызова этих API (например, используя SHGetPropertyStoreForWindow для установки другого идентификатора приложения для окна субмодуля), к которому я затем использую JNA для доступа во время выполнения.

.
4
ответ дан 27 November 2019 в 15:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: