2010-10-25 51 views
0

Salut tout, j'essaie de comprendre pourquoi cela n'envoie pas un ALT + F au bloc-notes!Findwindow et SendMessage

Private Declare Function FindWindow1 Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
Private Const WM_KEYUP = &H101 
Private Const WM_KEYDOWN = &H100 
Private Const WM_SYSKEYDOWN = &H104 

Private Sub Command_Click() 
Dim parenthwnd As Long 
Dim hwnd As Long 

    parenthwnd = FindWindow1(vbNullString, "Untitled - Notepad") 
    retvalue = SendMessage(parenthwnd, WM_SYSKEYDOWN, VK_MENU, 1&) 
    retvalue = SendMessage(parenthwnd, WM_KEYDOWN, VK_F, 1&) 
End Sub 

je reçois une valeur pour parenthwnd mais pas pour l'une des valeurs retvalue (0).

Qu'est-ce que je manque ???

David

+0

Quelqu'un d'autre veut-il tenter le coup? – StealthRT

Répondre

0

Utilisez postMessage au lieu de Sendmessage

Public Const WM_SYSKEYDOWN = &H104 

PostMessage hwnd, WM_SYSKEYDOWN, vbKeyF, 2^29 

'Simulates Alt + F (2^29 sets the 29 bit of lParam indicating Alt is being pressed. 
+0

Merci pour la réponse, Cidtek mais ça n'a pas l'air de marcher. – StealthRT

0

Je pense que c'est le problème: vous envoyez votre message au cadre autour de la fenêtre de bloc-notes, et ont besoin de l'envoyer au menu fenêtre. Utilisez votre handle avec FindWindowEx et le nom de classe 32768 (c'est un menu) pour obtenir la fenêtre de menu, qui est un enfant de celui que vous avez la poignée. Voici deux pages: http://msdn.microsoft.com/en-us/library/ms633500(v=VS.85).aspx et http://msdn.microsoft.com/en-us/library/ms633574(VS.85).aspx#class_name qui devrait aider.

1

Vous pouvez essayer d'envoyer/poster ces messages tout ce que vous voulez. Malheureusement, ils n'affectent pas la valeur de retour de GetAsyncKeyState - qui est ce que le système utilise, tout en traitant le message VK_F - pour voir si l'alt est en panne. Par conséquent, vous ne pouvez pas simuler des frappes avec des modificateurs à d'autres applications utilisant ce mécanisme. Pour contourner cela, vous devez utiliser SendInput - mais cela nécessite que l'application pour recevoir les séquences de touches soit la fenêtre de premier plan/focus.

+0

Ou essayez l'instruction VK6 SendKeys – MarkJ