2009-07-08 5 views
4

En utilisant Winspector J'ai découvert l'ID de la zone de texte enfant que je veux changer est 114. Pourquoi ce code ne change-t-il pas le texte de la zone de texte?SetText de zone de texte dans une application externe. Win32 API

[DllImport("user32.dll")] 
    static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); 
    [DllImport("user32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, int msg, int Param, string s); 

    const int WM_SETTEXT = 0x000c; 

    private void SetTextt(IntPtr hWnd, string text) 
    { 
     IntPtr boxHwnd = GetDlgItem(hWnd, 114); 
     SendMessage(boxHwnd, WM_SETTEXT, 0, text); 
    } 

Répondre

7

Voici ce que je l'ai utilisé avec succès à cette fin w/mon erreur GetLastError vérification retirée/handicapés:

[DllImport("user32.dll", SetLastError = false)] 
public static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); 
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
public static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, string lParam); 
public const uint WM_SETTEXT = 0x000C; 

private void InteropSetText(IntPtr iptrHWndDialog, int iControlID, string strTextToSet) 
{ 
    IntPtr iptrHWndControl = GetDlgItem(iptrHWndDialog, iControlID); 
    HandleRef hrefHWndTarget = new HandleRef(null, iptrHWndControl); 
    SendMessage(hrefHWndTarget, WM_SETTEXT, IntPtr.Zero, strTextToSet); 
} 

Je l'ai testé ce code et il fonctionne, donc si elle échoue Pour vous, vous devez vous assurer que vous utilisez la poignée de la fenêtre de droite (la poignée de la boîte de dialogue elle-même) et le bon ID de contrôle. Essayez également quelque chose de simple comme l'édition de la boîte de dialogue Rechercher dans le Bloc-notes.

Je ne peux pas encore commenter dans l'article concernant l'utilisation (char *) mais ce n'est pas nécessaire. Voir la deuxième surcharge C# dans p/Invoke SendMessage. Vous pouvez passer String ou StringBuilder directement dans SendMessage.

Je note en outre que vous dites que votre ID de contrôle est 114. Êtes-vous certain que WinSpector vous a donné cette valeur en base 10? Parce que vous l'alimentez à GetDlgItem en tant que numéro de base. J'utilise Spy ++ pour cela et il retourne les ID de contrôle dans la base 16. Dans ce cas, vous utilisez:

IntPtr boxHwnd = GetDlgItem(hWnd, 0x0114); 
+0

WinSpector renvoie les numéros de base 10. J'ai fait une petite application de test avec Visual Studio et cette technique fonctionne bien, mais elle ne fonctionne pas pour les applications réelles avec lesquelles je travaille. – Kirschstein

+0

Lorsque vous parcourez le code w/l'application réelle, GetDlgItem() renvoie-t-il une valeur non nulle? – Gregyski

+1

Oui, c'est le cas, et je peux récupérer du texte existant en utilisant WM_GETTEXT. C'est juste WM_SETTEXT qui ne fonctionne pas. – Kirschstein

0

Êtes-vous sûr que vous passez le texte à droite? SendMessage last param doit être un pointeur sur char * contenant le texte que vous voulez définir.
Regardez mon « hack brut » du texte mise en How to get selected cells from TDBGrid in Delphi 5
cela se fait dans Delphi 5, où PChar est char * alias, et je simplement jeté comme int (entier en Delphi).

0

Vous devez vous assurer que le "texte" est alloué dans l'espace mémoire de l'application externe. Vous ne serez pas en mesure d'allouer du texte dans l'application appelant et de le passer à une autre application, car chacun d'entre eux aura son propre espace mémoire privé.

0

S'il vous plaît convertir votre identifiant de commande (obtenu à partir spy ++) de hexdecimal Nombre en nombre décimal et de transmettre cette valeur à la GetDlgItem function.With cette
vous obtiendrez la poignée de box.This texte a fonctionné pour moi.

[DllImport("user32.dll")] 
static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); 
[DllImport("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd, int msg, int Param, string s); 

const int WM_SETTEXT = 0x000c; 

private void SetTextt(IntPtr hWnd, string text) 
{ 
    IntPtr boxHwnd = GetDlgItem(hWnd, 114); 
    SendMessage(boxHwnd, WM_SETTEXT, 0, text); 
} 
Questions connexes