[C++]Handle van een EditField krijgen

Pagina: 1
Acties:

  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 11-06 11:16
Hallo mensen,

ik heb het volgende probleem. Ik heb een programma geschreven dat automatisch
een save String maakt. ( bijv: plaatje_01.bmp, plaatje_02.bmp, etc )
Deze String zet ik op het clipboard.
Vervolgens zoek ik de handle naar het "Save venster". Zie de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  HWND handleToWindow;
  HWND handleToEditField;

  //Get handle to the Save As window
  const char *windowName = "Save As";

  handleToWindow = FindWindow(NULL, TEXT(windowName));
  if(handleToWindow == NULL)
  {
    ShowMessage( "Couldn't find " + AnsiString(windowName) );
  }
  else
  {
    //handleToEditField = ???;
    //Need handle to EditField on Save Window
    SendMessage(handleToEditField, WM_PASTE, 0, 0);
    //Paste what's in the clipboard to the editfield
  }


Om nu dus de save string in het editfield te kunnen plakken heb ik de handle nodig
van dit EditField. Maar ik weet niet hoe ik die kan krijgen. Wie helpt?

Bij voorbaat heeeel veeeel dank. _/-\o_ _/-\o_ _/-\o_

Pwnd


Verwijderd

CWnd* Wnd = FromHandle(handleToWindow);
handleToEditField = Wnd->EditField.m_hwnd;

Dit is een gokje uit het hoofd. Ik weet niet zeker of dit werkt.

  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 11-06 11:16
Hmm is dat VC++ code? Ik gebruik Borland C++ Builder 5 :X

Pwnd


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Zoiets?
C++:
1
2
3
4
5
6
7
8
9
    HWND hWnd = FindWindow(NULL, "Save As");
    if (hWnd)
    {
        HWND hWndChild = GetDlgItem(hWnd, 0x47C);
        if (hWndChild)
        {
            SendMessage(hWndChild, WM_SETTEXT, NULL, (LPARAM)"test");
        }
    }

WM_SETTEXT is netter dan het clipboard denk ik en werkt ook voor windows van andere draaiende programma's. Is die 'save as' dialog van je eigen programma of van een ander?

Echt netjes is dit ook niet, 0x47C is bij mij (win2ksp3) het ID van de combobox (tis geen gewone editbox bij mij) in een standaard 'save as' dialog maar dat zal hoogstwaarschijnlijk wel verschillen per OS versie/build. Je kunt ook alle comboboxes langsgaan maar dan weet je nog niet welke je moet hebben).

Als het programma alleen voor eigen gebruik is zal dit wel redelijk werken, het zal niet overal werken.

www.madwizard.org


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Donderwolk schreef op 04 oktober 2002 @ 16:32:
Hallo mensen,

ik heb het volgende probleem. Ik heb een programma geschreven dat automatisch
een save String maakt. ( bijv: plaatje_01.bmp, plaatje_02.bmp, etc )
Deze String zet ik op het clipboard.
Vervolgens zoek ik de handle naar het "Save venster". [ SNIP ]
Om nu dus de save string in het editfield te kunnen plakken heb ik de handle nodig
van dit EditField. Maar ik weet niet hoe ik die kan krijgen. Wie helpt?
Als ik je goed begrijp wil je de edit box "file name"van de Save-As common control dialog hebben. Dat is even lastig, omdat er verschillende versies van bestaan ( uit m'n hood tenminste 4 ) op verschillende Windows ( IE? ) versies.

De file naam gaat in een child window; je kunt dus alle child windows enumereren. Maar om vervolgens de goede te vinden is lastig. Zoals al eerder opgemerkt is in de nieuwste common dialog deze control een combo box, maar in de oudere varianten was het idd een edit box.

Ik ga's zoeken, klopt't wat ik geschreven heb?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 11-06 11:16
WM_SETTEXT is netter dan het clipboard denk ik en werkt ook voor windows van andere draaiende programma's. Is die 'save as' dialog van je eigen programma of van een ander?
Het Save As dialog is van een ander programma.
Echt netjes is dit ook niet, 0x47C is bij mij (win2ksp3) het ID van de combobox (tis geen gewone editbox bij mij) in een standaard 'save as' dialog maar dat zal hoogstwaarschijnlijk wel verschillen per OS versie/build. Je kunt ook alle comboboxes langsgaan maar dan weet je nog niet welke je moet hebben).
Nee het adres is bij mij niet 0x47C. Maar ik gebruik mijn programma voor maar een specifiek Save As dialog. Hoe kan ik achter dat adres komen? Ik heb win2ksp3.

Pwnd


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

WM_SETTEXT is inderdaad beter.

Je had er even bij moeten melden dat het ging om een venster die niet van jouw programma was :) Had veel onnodige posts gescheeld.

De Handle van die editbox veranderd per keer dat het form geshowed wordt, dus je zal m runtime moeten achterhalen. Via GetDlgItem van madwizard kan je aan de hand een constante (per windows verschillende) ID de Handle achterhalen.

Nu is je probleem alleen nog te achterhalen wat het ID is. Dat kan door te kijken in de resource van de dialoog die je zoekt met een resource editor. Dat kan alleen als het een dialoog is en de componenten niet runtime worden gemaakt. Borland's programma's maken weinig gebruik van dialogen, dus daar zal je weinig geluk bij hebben.

We adore chaos because we like to restore order - M.C. Escher


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Je kunt het ID achterhalen met een progje als Spy & Capture (zoek bij programmer's tools). Daarmee kun je elk window selecteren en zijn eigenschappen opvragen.
LordLarry schreef op 07 oktober 2002 @ 09:59:
Nu is je probleem alleen nog te achterhalen wat het ID is. Dat kan door te kijken in de resource van de dialoog die je zoekt met een resource editor. Dat kan alleen als het een dialoog is en de componenten niet runtime worden gemaakt.
Das niet helemaal waar, als je een venster runtime maakt (CreateWindow(Ex) & co) moet je ook een ID opgeven, dus die is wel te vinden (als de programmeurs het ook netjes gebruikt hebben). GetDlgItem werkt op elk window dus dat moet ook geen probleem zijn.

www.madwizard.org


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je hebt gelijk. Ik wist alleen niet dat er programma's waren die die runtime dingen konden laten zien. Bedankt voor de info

We adore chaos because we like to restore order - M.C. Escher


  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 11-06 11:16
Het werkt!

Die handles veranderen inderdaad de hele tijd. Maar het ID van het tekstveld blijft inderdaad de hele tijd hetzelfde. De code ziet er nu zo uit:

C++:
1
2
3
4
5
6
7
//TekstField ID = 00000480, uitgezocht met Spy & Capture;
HWND hWndChild = GetDlgItem(hWnd, 0x00000480);

if (hWndChild)
{
   SendMessage(hWndChild, WM_SETTEXT, NULL, (LPARAM)"test");
}


Nu alleen de lparam nog even aanpassen natuurlijk ;)

Ik wil hierbij graag iedereen bedanken die een bijdrage heeft geleverd.
Mijn dank is groot! _/-\o_ _/-\o_ _/-\o_

Pwnd

Pagina: 1