Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
Gustavo Luiz G. Ferreira

Usando Apis No Vb

Recommended Posts

bom dia. só pra avisar, deu problema nas duas ultimas mensagens não sei porque.

eu preciso fazer um programa no VB que "detecte" uma API e evite que ela ocorra. Por exemplo, estou no Internet Explorer e quando eu clico no fechar, não quero que esse evento ocorra e, com um programa rodando, evite que eu fechasse.

para fazer isso eu estava pensando em um activex +- assim:

Module:

declararia as APIs WM_Close (para detectar quando acontece algum evento de fechar) e getActiveWindow (para saber se a tela aberta é a do programa que eu não quero fechar)

Class:

janelaAtiva = getActiveWindow

on WM_Close goto evitaFechar

evitaFechar:

if janelaAtiva = x ("numero" da janela) then

aqui evitaria o fechamento, ou mostraria uma mensagem (não sei o q colocar pra "evitar" o fechamento)

end if

eu sei q tem uma renca de erros nesse codigo, fora o q eu não sei o q é pra colocar, então gostaria de uma ajuda.

valeu e Spoley-Oley :tantan:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega, não vou dizer que o que você quer é impossível, mas e extremamente difícil.

Encontrar uma janela até que é fácil, basta usar as APIs FindWindow ou FindWindowEx. Fechar é bem fácil também, depois de encontrada, basta usar SendMessage com a constante WM_CLOSE.

Agora fazer o contrário, isto é, evitar que o fechamento ocorra é bem mais complicado.

Primeiro você precisaria descobrir quais os processos que estão controlando cada janela do IE. Em WinNT ou outros da mesma plataforma, você pode fazer com a API EnumProcesses, mas essa API não funciona em Win9x.

A solução seria enumerar os valores hWnd de cada janela aberta. Isso você pode fazer com a API EnumWindows. Para descobrir qual hWnd pertence à determinada janela, você precisaria usar um desses dois métodos:

1) Método 'Gambiarra', pegando o Caption de cada janela com a API FindWindow;

2) Método 'Profissional', pegando o nome da classe usando API GetClassName.

É bem mais seguro identificar o nome da classe, uma vez que ela não muda (no caso do IE vai ser sempre "IEFrame"). Já o Caption, você poderia procurar onde está escrito 'Microsoft Internet Explorer', mas vale lembrar que isso pode ser alterado no Registro, por Browsers tipo AOL/UOL, etc...

Aí vai um pequeno exemplo e como você poderia enumerar as classes em execução e seu respectivo hWnd:

1) Coloque isso num módulo:

Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Private Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
   Dim Classe As String, Retorno As Long
   Classe = Space(256)
   GetClassName hwnd, Classe, 256
   Form1.List1.AddItem "hWnd: " & CStr(hwnd) & ", Classe: " & Classe
   EnumWindowsProc = True
End Function

Public Sub EnumerarProcessos()
   EnumWindows AddressOf EnumWindowsProc, ByVal 0&
End Sub

2) Num Form, coloque um ListBox e esse código

Private Sub Form_Load()
   EnumerarProcessos
End Sub

Daí, é só procurar na lista onde está a classe "IEFrame" para pode manipular.

Agora, o problema (ou seja, a "bucha") principal reside na monitoração dos processos que envolveriam o fechamento dos processos nas classes "IEFrame".

Essa parte eu devo confessar que não tenho a menor ideia de como você poderia fazer.

Existe uma API chamada "PostQuitMessage" que informa ao Windows que foi solicitado o encerramento de um determinado processo, talves seja esse o caminho.

Se você ainda não tem a ferramenta API-Guide, sugiro que faça o download aqui. Essa ferramenta com certeza vai ajudá-lo bastante (bem mais que eu, com certeza he he he)

Boa sorte!

^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Bom, já peguei o espírito da coisa. Mas eu to precisando de uma ajuda prática, que a lógica eu já tenho.

    O que eu preciso seria criar uma rotina de repetição que verificasse se a função de fechar foi chamada. O que eu estava pensando em fazer:

    Módulo

    Public Const WM_QUIT = &H12 OU

    Public Const WM_CLOSE = &H10 OU

    Public Const WM_DESTROY = &H2

    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long OU

    Public Declare Sub PostQuitMessage Lib "user32" Alias "PostQuitMessage" (ByVal nExitCode As Long)

    Form ou Classe (preferência pra classe, que eu pretendo fazer um ActiveX rodando independente)

    Aqui a coisa pega. Eu tentei criar uma variável para efetuar um while. Meu principal problema é que, no curso que eu fiz, só aprendi a fazer banco de dados, não aprendi a "reinicar" um while, só fazer com que ele vá enchendo linhas e colunas enquanto não chegar no fim do arquivo.

    Mas se eu consigo fazer o while, para detectar, eu estava pensando em alguma coisa mais ou menos assim:

    NomeDaClasse.on WM_CLOSE GoTo MandaFechar (bom, isso eu sei q ta errado)

    MandaFechar:

    MsgBox "Mensagem", vbYesNo, tralala (num lembro a ordem q aparece)

    aí, se a resposta for diferente de 46 (que seria o "sim"), então iria cancelar a API. Se fosse 46, iria pra próxima mensagem, e por aí afora.

    Bom, o que eu tenho é mais ou menos isso. Duas considerações importantes:

    - Com um programinha bem legal (Spy ++), eu percebi q quando for fechar algum programa, envia-se a constante WM_CLOSE, faz todas as verificações de fechamento e aí manda o WM_DESTROY, que tiraria da memória o programa em uso (além de fecha ele, básico).

    - O que eu preciso é de que quando mandar fechar (WM_CLOSE), apareça uma mensagem de sim e não, não quero que apareça um form (mas se não tiver jeito, também não acho ruim). Se a resposta for não em alguma delas, vai cancelar a API. Com o Spy++, eu consigo enxergar todos os processos que ocorrem, mas isso não adianta muito se eu não consigo cancelá-los.

    Agora sim temos um problema! Ahá! Alguém mi ajuda ^ _ ^'

    :muro::tantan:

    valeu e Spoley-Oley

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Vou dar uma ideia do que eu tentaria fazer:

    Fazeria uma .dll que capturaria(hook) esses eventos:

    WM_QUIT

    WM_CLOSE

    WM_DESTROY

    de todas as aplicações. Se fosse diferente de:

    IEFrame

    o hook não iria fazer nada... caso contrário, desviaria as respectivas mensagens para o DefWindowProc... ou senão colocava uma senha para checagem e caso estivesse correta, deixava executar as mensagens de fechamento...

    isso tudo usando API-Win32, é claro...

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×