Estou tentando descobrir uma forma de colocar um aplicativo ou uma caixa de texto em java na barra de tarefas, tipo desktop bands. Alguem ja tentou ou conseguiu fazer essa “mágica”? Tem que manipular dlls e tal, esse é que é o problema.
exemplo:
Estou tentando descobrir uma forma de colocar um aplicativo ou uma caixa de texto em java na barra de tarefas, tipo desktop bands. Alguem ja tentou ou conseguiu fazer essa “mágica”? Tem que manipular dlls e tal, esse é que é o problema.
exemplo:
Credo, o exemplo é em C++.
Quando eles mostram essas coisas em C++ em vez de mostrá-las em VB ou VB.NET é sinal que não é tão fácil de fazer assim.
Já foi um sufoco o pessoal escrever bibliotecas para suportar o tray icon ( https://jdic.dev.java.net ) para poderem ser usadas no Mustang (a partir do build 37 se não me engano).
Por curiosidade, que programas usam isso, sem ser esse exemplo do MSDN?
Bom, antes obrigado por se interessar. Teriamos como exemplo o Windows Mídia Player onde você opta por colocar ele como se estivesse minimizado, mas funciona só em xp, e teriamos também o Google Desktop Search que coloca uma caixa de texto para buscas no mesmo local. Meu cara… pensei, se for possível fazer com o java… sei que não é impossível.
O link : http://toolbar.google.com/deskbar/help/api/plugin_documentation.html é interessante, tem o código em C++ que também é .NET e unclusive tem a dll que faz a “jogada”. Se houvesse uma maneira de usála com o java… meio caminho andado.
Bom, como todas as boas idéias, alguém deve ter escrito algo que faça tudo isso (implementar a interface COM IDeskBand, registrar-se como uma DLL COM, e ainda por cima iniciar a JVM. Em .NET é relativamente mais fácil porque é fácil expor um assembly .NET como uma DLL COM comum. Mas Java não tem essas comodidades de uma maneira simples.
Pensei em usar o JNI e criar uma dll, rodar a dll criada com o JNI. A dll criada executaria a dll que faz a funcionalidade de jogar lá na barra.
O mais legal é que eu nunca fiz isso e mal sei programar em C.
Haha, só quero ver no que vai dar… vc acha que essa poderia ser uma boa forma de fazer? Nunca usei JNI vc ja usou??
Não é muito fácil, e dá uns erros esquisitíssimos se algo der errado. Não são erros fáceis de entender como stack traces.
São erros esquisitos que aparecem no C++ mesmo, só tente isso se você tiver uma biblioteca que faça o serviço sujo do JNI para você (e mesmo assim prepare-se para ter um pouco de dor de cabeça).
Existem bibliotecas que fazem o contrário (o Java chamando uma DLL COM ou DLL normal), mas bibliotecas que expõem uma classe Java com uma interface COM não padrão (que é o caso da IDeskBand) eu não conheço. Normalmente as interfaces COM que podem ser expostas são mais simples (são aquelas que podem ser chamadas a partir de um programa VB normal via CreateObject). Mas esse tipo de interface já é meio difícil de fazer, mesmo em C++ mesmo.
Fiz esse exemplo, ele mantém um JWindow no canto esquerdo, logo acima do TaskBar. Dá p/ você simular o efeito dos controles do Media Player sem ter que mexer com JNI e mantendo compatibilidade. Dê uma olhada, dá p/ melhorar muita coisa ainda:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.SystemColor;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;
public class Janelinha implements ActionListener {
JWindow windowJanelinha;
JLabel label1;
JButton button1;
FlowLayout layout1;
JPanel panel1;
public Janelinha() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e) {
}
//Tudo isso p/ pegar o tamanho da Taskbar
Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration());
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
windowJanelinha = new JWindow();
layout1 = new FlowLayout();
label1 = new JLabel("Janelinha");
button1 = new JButton("Fechar");
panel1 = new JPanel();
panel1.setBorder(new LineBorder(SystemColor.textHighlight));
button1.addActionListener(this);
windowJanelinha.setContentPane(panel1);
windowJanelinha.getContentPane().setLayout(layout1);
windowJanelinha.getContentPane().add(label1);
windowJanelinha.getContentPane().add(button1);
windowJanelinha.setSize(150, 30);
windowJanelinha.setLocation(screenSize.width - 150, screenSize.height - 30 - insets.bottom);
windowJanelinha.setAlwaysOnTop(true);
windowJanelinha.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
windowJanelinha.setVisible(false);
System.exit(0);
}
public static void main(String args[]) {
new Janelinha();
}
}
Obrigado… rodei seu código pra ver, ficou bem legal, eu fiz um lance parecido como medida paleativa. Quando surge uma mensagem nova aparece uma janelinha que mostra as mensagens e depois ela minimiza, usei TrayIcon etc… Mas valeu pelo interesse, muito obrigado.