INICIAR APLICATIVO AO CARREGAR O WIN?
Bem, só falta acertar isto e termino o meu projeto aqui.
Estou fazendo assim, coloquei um checkbox na janela inicial, no qual se deixar marcado, ao sair no form_unload() terá o código abaixo:
Agora como faria para deletar se eu deixar desmarcado ao sair? Reg.RegDelete ...? E teria algum problema de ficar sempre criando e deletando mesmo que eu não tenha feita alteração, tipo, iniciou marcado e termina marcado o checkbox? O que eu poderia fazer? E estou colocando no form_load() --> me.hide, mas está abrindo o programa ao carregar e no caso quero que só carregue e fique na bandeja ao carregar o windows, só dá certo se eu colocar o me.hide no form_activate(), mas ainda aparece a janela no desktop e depois some e toda vez que vou para uma outra janela e volto para inicial a sub form_activate é ativado e assim executa o me.hide.
Estou fazendo assim, coloquei um checkbox na janela inicial, no qual se deixar marcado, ao sair no form_unload() terá o código abaixo:
Private Sub Form_Unload(Cancel As Integer)
Dim Reg As Object
If chkIniAutoNC.Value = 1 Then
Set Reg = CreateObject("wscript.shell")
Reg.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN\" & "nome_exe", App.Path & "
ome.exe"
End If
Agora como faria para deletar se eu deixar desmarcado ao sair? Reg.RegDelete ...? E teria algum problema de ficar sempre criando e deletando mesmo que eu não tenha feita alteração, tipo, iniciou marcado e termina marcado o checkbox? O que eu poderia fazer? E estou colocando no form_load() --> me.hide, mas está abrindo o programa ao carregar e no caso quero que só carregue e fique na bandeja ao carregar o windows, só dá certo se eu colocar o me.hide no form_activate(), mas ainda aparece a janela no desktop e depois some e toda vez que vou para uma outra janela e volto para inicial a sub form_activate é ativado e assim executa o me.hide.
Esqueci de dizer, já vi outros códigos que trabalham muito bem com o registro do win, mas achei grande demais o código e eu só quero criar ou deletar o registro que irá rodar o programa ao iniciar o win, então acabei gostando deste que é apenas 3 linhas, pelo menos para criar.
uso uma classe com o seguinte código (veja que tem um método para deletar registros):
Const HKEY_CURRENT_USER = &H80000001
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Public Sub SalvarRegistro(ByVal NomReg As String, ByVal NomKey As String, ByVal Dado As String)
SaveStringLong HKEY_CURRENT_USER, NomReg, NomKey, Dado
End Sub
Private Sub SaveStringLong(hKey As Long, strPath As String, strValue As String, strData As String)
Dim Ret As Long
'Create a new key
RegCreateKey hKey, strPath, Ret
'Set the key's value
RegSetValueEx Ret, strValue, 0, 1, ByVal strData, Len(strData)
'close the key
RegCloseKey Ret
End Sub
Public Function LeRegistro(ByVal NomReg As String, ByVal NomKey As String) As String
'Get a string from the registry
LeRegistro = GetString(HKEY_CURRENT_USER, NomReg, NomKey)
End Function
Private Function GetString(hKey As Long, strPath As String, strValue As String)
Dim Ret As Long
'Open the key
RegOpenKey hKey, strPath, Ret
'Get the key's content
GetString = RegQueryStringValue(Ret, strValue)
'Close the key
RegCloseKey Ret
End Function
Private Sub DelSetting(hKey As Long, strPath As String, Optional strValue As String = "")
Dim Ret As Long
'Create a new key
RegCreateKey hKey, strPath, Ret
If strValue = "" Then
RegDeleteKey Ret, ""
Else
RegDeleteValue Ret, strValue
End If
'close the handle
RegCloseKey Ret
End Sub
Public Sub ApagarRegistro(ByVal NomReg As String, Optional NomKey As String)
'Delete the setting from the registry
DelSetting HKEY_CURRENT_USER, NomReg, NomKey
End Sub
Private Function RegQueryStringValue(ByVal hKey As Long, ByVal strValueName As String) As String
Dim lResult As Long, lValueType As Long, strBuf As String, lDataBufSize As Long
'retrieve nformation about the key
lResult = RegQueryValueEx(hKey, strValueName, 0, lValueType, ByVal 0, lDataBufSize)
If lResult = 0 Then
strBuf = String(lDataBufSize, Chr$(0))
'retrieve the key's content
lResult = RegQueryValueEx(hKey, strValueName, 0, 0, ByVal strBuf, lDataBufSize)
If lResult = 0 Then
'Remove the unnecessary chr$(0)'s
RegQueryStringValue = Left$(strBuf, InStr(1, strBuf, Chr$(0)) - 1)
End If
End If
End Function
Já vi esse código, mas achei grande. Acho que não tenho alternativa mesmo, vou ter que utilizar um desses códigos. E quanto as outras questões poderia me ajudar?
e este form vai ser aberto ou vai ficar sempre "na bandeja"? Porque se ele não vai ser visualizado, bastava setar visible=false.
Se não, se for pra ele ficar "na bandeja" e depois o usuário chamar ele, aà não sei, aliás, preciso saber disso também..hehe
Se não, se for pra ele ficar "na bandeja" e depois o usuário chamar ele, aà não sei, aliás, preciso saber disso também..hehe
Vai ser aberto também, o usuário precisa configurar algumas coisas. O que pensei é colocar mais um checkbox dizendo se ele quer que ao carregar o programa já abra ou fique na bandeja, mas ainda tenho que colocar o me.visible = false na sub activate se colocar no form_load ou apenas especificar pelas propriedades o programa é aberto ao carregar e ainda que eu coloque no activate ainda aparece o programa bem rápido antes de ficar visible=false.
TAMANINI...
não seria mais fácil fazer um .reg e executá-lo via código?
não seria mais fácil fazer um .reg e executá-lo via código?
Um .reg e este faria o papel de criar ou apagar o registro que fica na pasta RUN? Tem algum exemplo aqui no site? E quanto a carregar, mas não mostrar o programa na tela, já ficar direto na bandeja?
Outra maneira que me passaram foi deixar em branco o registro quando desmarcado o checkbox, tipo:
Set Reg = CreateObject("wscript.shell")
Reg.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN\" & "nome_exe", App.Path & ""
Mas falta o problema de quando saber que é para carregar na bandeja apenas ou é para abrir e mostrar se o programa estiver fechado e o usuário clica duas vezes na icone para carregar? Então acho melhor também criar mais um checkbox, o que acha?
Outra maneira que me passaram foi deixar em branco o registro quando desmarcado o checkbox, tipo:
Set Reg = CreateObject("wscript.shell")
Reg.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN\" & "nome_exe", App.Path & ""
Mas falta o problema de quando saber que é para carregar na bandeja apenas ou é para abrir e mostrar se o programa estiver fechado e o usuário clica duas vezes na icone para carregar? Então acho melhor também criar mais um checkbox, o que acha?
faria o papel de criar... apagar não - talvez alterar...
Resolvi fazer assim:
Verificar se existe o registro que pode ter sido já criado ao instalar o programa e verificar se foi alterado o checkbox para iniciar automatico, se sim, ao encerrar o aplicativo ele faz a alteração no registro, tipo, se não é mais para iniciar automático, irá ficar em branco o campo DADOS no registro do win em vez de apagar. Agora o problema é como saber ao carregar o programa se é para mostrar a janela ou é só para ficar na bandeja, tipo, carrega o win e então carrega o programa, ficando na bandeja sem mostrar, depois fecho o programa e resolvo abrir ele, então agora iria mostrar a janela ao carregar, teria como isto?
Verificar se existe o registro que pode ter sido já criado ao instalar o programa e verificar se foi alterado o checkbox para iniciar automatico, se sim, ao encerrar o aplicativo ele faz a alteração no registro, tipo, se não é mais para iniciar automático, irá ficar em branco o campo DADOS no registro do win em vez de apagar. Agora o problema é como saber ao carregar o programa se é para mostrar a janela ou é só para ficar na bandeja, tipo, carrega o win e então carrega o programa, ficando na bandeja sem mostrar, depois fecho o programa e resolvo abrir ele, então agora iria mostrar a janela ao carregar, teria como isto?
bem...
faça com que ao iniciar o windows, passe um parà ¢metro...
faça uma sub main no seu projeto, que pegue este parà ¢metro com "Command"...
assim, se executar pelo atalho, não vai ter parà ¢metro, então mostra a tela... tendo parà ¢metro, não mostra... por pura convenção, o parà ¢metro poderia ser "background"
faça com que ao iniciar o windows, passe um parà ¢metro...
faça uma sub main no seu projeto, que pegue este parà ¢metro com "Command"...
assim, se executar pelo atalho, não vai ter parà ¢metro, então mostra a tela... tendo parà ¢metro, não mostra... por pura convenção, o parà ¢metro poderia ser "background"
Tópico encerrado , respostas não são mais permitidas