001package conexp.fx.gui.util;
002
003/*
004 * #%L
005 * Concept Explorer FX
006 * %%
007 * Copyright (C) 2010 - 2023 Francesco Kriegel
008 * %%
009 * This program is free software: you can redistribute it and/or modify
010 * it under the terms of the GNU General Public License as
011 * published by the Free Software Foundation, either version 3 of the
012 * License, or (at your option) any later version.
013 * 
014 * This program is distributed in the hope that it will be useful,
015 * but WITHOUT ANY WARRANTY; without even the implied warranty of
016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
017 * GNU General Public License for more details.
018 * 
019 * You should have received a copy of the GNU General Public
020 * License along with this program.  If not, see
021 * <http://www.gnu.org/licenses/gpl-3.0.html>.
022 * #L%
023 */
024
025
026import com.sun.jna.Native;
027import com.sun.jna.NativeLong;
028import com.sun.jna.Pointer;
029import com.sun.jna.WString;
030import com.sun.jna.ptr.PointerByReference;
031
032public class AppUserModelIdUtility {
033
034  static {
035    Native.register("shell32");
036  }
037
038  private static native NativeLong GetCurrentProcessExplicitAppUserModelID(PointerByReference appID);
039
040  private static native NativeLong SetCurrentProcessExplicitAppUserModelID(WString appID);
041
042  // DO NOT DO THIS, IT'S JUST FOR TESTING PURPOSE AS I'M NOT FREEING THE MEMORY
043  // AS REQUESTED BY THE DOCUMENTATION:
044  //
045  // http://msdn.microsoft.com/en-us/library/dd378419%28VS.85%29.aspx
046  //
047  // "The caller is responsible for freeing this string with CoTaskMemFree when
048  // it is no longer needed"
049  public static final String getCurrentProcessExplicitAppUserModelID() {
050    final PointerByReference r = new PointerByReference();
051
052    if (GetCurrentProcessExplicitAppUserModelID(r).longValue() == 0) {
053      final Pointer p = r.getValue();
054
055      return p.getString(0, true); // here we leak native memory by lazyness
056    }
057    return "N/A";
058  }
059
060  public static final void setCurrentProcessExplicitAppUserModelID(final String appID) {
061    if (SetCurrentProcessExplicitAppUserModelID(new WString(appID)).longValue() != 0)
062      throw new RuntimeException("unable to set current process explicit AppUserModelID to: " + appID);
063  }
064
065}