Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hi! Hab folgendes Problem:

Mein Programm öffnet Micorsoft Word zum scannen von Dokumenten. Der Benutzer speichert diese in ein Verzeichnis. Dann soll mein Programm das Dokument aus dem Vezeichnis holen und weiter damit arbeiten.

Nur woher weiß mein Programm, dass der User die Datei gespeichert und Word beendet hat? Ich wollte es mit einer MessageBox machen. Also dass man erst die MessageBox schließt bevor das Programm weiterläuft.

Leider drängt sich die MessageBox vor Word. D.H. wenn man nicht in die Taskleiste schaut bekommt man gar nicht mit, dass Word aufgeganegen ist weil die MessageBox und mein Programm dann im Vordergrund ist.

Gibts da nicht eine schönere Lösung wie man das machen könnte?

Habt Ihr ne Idee wie man das lösen könnte?

Gruß, Filou

Mit ShellExecute...

ShellExecute(NULL,"open",m_DBSettings.m_DefaultDocPath + "\\Vorlage\\Scannen.dot",NULL,NULL,SW_SHOWNOACTIVATE);

Ja das wäre eine Möglichkeit!

Super Idee! Wie macht man das?

Also mit welcher Funktion sage ich dem Dialog er soll minimiert sein?

Mit WaitForSingleObject könntest du zumindest warten bis Word geschlossen wird. Aber ob er gespeichert hat weißt du so nicht..

Das wäre toll!! Ob er gespeichert hat oder nicht weiß ich dan, wenn das Verzeichnis leer ist.

Was für ein Handle muss ich in der Funktion angeben? Wie funktioniert das genau? Woher weiß ich welches Handle Word hat?

Das mit den Handles hab ich nie ganz kapiert. :confused:

Ich mache jetzt aber Feierabend. Melde mich morgen nochmal wenn ichs nicht hin bekomme.

Danke Euch trotzdem!!!!

Bye

Guten Morgen Leutz :)

Ich habe es jetzt mit WaitForSingleObject versucht.

Das Programm läuft, es bekommt nur noch nicht mit dass Word geschlossen wurde...

Ich habs so gemacht:


DWORD WINAPI test;

HWND hWnd;


//Dokumentenvorlage zum Scannen öffnen

	ShellExecute(hWnd,"open",m_DBSettings.m_DefaultDocPath + "\\Vorlage\\Scannen.dot",NULL,NULL,SW_SHOWNOACTIVATE);

	test = WaitForSingleObject(hWnd, 10000);

	while (test != 0x00000000L)

		{

		test = WaitForSingleObject(hWnd, 10000);

		}

Es soll so lange warten bis Word beendet ist.

Gruß, Filou

Auch wenn es vielleicht nicht so guter Programmierstil ist:


System([Pfad zur Exe] [Parameter]);

Danach wird meines Wissens auf jedenfall solang gewartet bis das Programm beendet wurde...

Kann mich aber auch irren.

Auch wenn es vielleicht nicht so guter Programmierstil ist:


System([Pfad zur Exe] [Parameter]);

Danach wird meines Wissens auf jedenfall solang gewartet bis das Programm beendet wurde...

Kann mich aber auch irren.

'System' : nichtdeklarierter Bezeichner

Kann es auch nicht in der MSDN finden. Nur als C#.

Bist Du Dir sicher dass es das gibt?

Das funktioniert irgendwie nicht. Da geht nur die Eingabeaufforderung auf. Aber öffnet mein Dokument nicht. Wenn ich den selben Pfad in die Eingabeaufforderung schreibe dauerts nen Moment und dann geht es aber auf.

Vielleicht könnt Ihr mir nochmal bei WaitForSingleObject helfen??

Danke für den Tip!

Aber ich verzweifle!!! :(

ich bekomms einfach net hin! :beagolisc :( :( :( :(

	DWORD WINAPI test;

	HWND hWnd;


	//Dokumentenvorlage zum Scannen öffnen

	LPSHELLEXECUTEINFO lpExecInfo;

	lpExecInfo->hwnd = hWnd;

	lpExecInfo->lpDirectory = m_DBSettings.m_DefaultDocPath + "\\Vorlage\\";

	lpExecInfo->lpFile = "scannen.dot";

	lpExecInfo->nShow = SW_SHOWMAXIMIZED;


	ShellExecuteEx(lpExecInfo);

	test = WaitForSingleObject(lpExecInfo->hwnd, 10000);


	while (test != WAIT_ABANDONED)

		{

		test = WaitForSingleObject(lpExecInfo->hwnd, 10000);

		}

	LPSHELLEXECUTEINFO lpExecInfo;
lpExecInfo->hwnd = hWnd;[/code]

Man sieht es dem Typen nicht direkt an, aber LPSHELLEXECUTEINFO ist ein Zeiger - das erkennst du an dem LP. Du schreibst also hier über einen uninitialisierten Zeiger irgendwo im Speicher herum. Du musst ein SHELLEXECUTEINFO-Objekt anlegen und dessen Adresse übergeben. Außerdem musst du die Struktur mit {0} initialisieren, sonst stehen in den Membern, die du nicht zuweist, willkürliche Werte. Den cbSize-Member musst du auf sizeof SHELLEXECUTEINFO setzen.

Auf Fensterhandle kann man nicht warten. Das [b]Prozess[/b]handle, auf das du warten kannst, steht im hProcess-Member, wenn du bei fMask SEE_MASK_NOCLOSEPROCESS setzt.

Man sieht es dem Typen nicht direkt an, aber LPSHELLEXECUTEINFO ist ein Zeiger - das erkennst du an dem LP. Du schreibst also hier über einen uninitialisierten Zeiger irgendwo im Speicher herum. Du musst ein SHELLEXECUTEINFO-Objekt anlegen und dessen Adresse übergeben. Außerdem musst du die Struktur mit {0} initialisieren, sonst stehen in den Membern, die du nicht zuweist, willkürliche Werte. Den cbSize-Member musst du auf sizeof SHELLEXECUTEINFO setzen.

Auf Fensterhandle kann man nicht warten. Das Prozesshandle, auf das du warten kannst, steht im hProcess-Member, wenn du bei fMask SEE_MASK_NOCLOSEPROCESS setzt.

Danke für die ausführliche erklärung.

Aber ganz kapiert hab ichs noch nicht. Schau mal:

	SHELLEXECUTEINFO *lpExecInfo;

	//Dokumentenvorlage zum Scannen öffnen

	lpExecInfo->cbSize = sizeof(SHELLEXECUTEINFO);

	lpExecInfo->dwHotKey=0;

	lpExecInfo->fMask=0;

	lpExecInfo->hIcon=0;

	lpExecInfo->hInstApp=0;

	lpExecInfo->hkeyClass=0;

	lpExecInfo->hMonitor=0;

	lpExecInfo->hProcess=0;

	lpExecInfo->lpClass=0;

	lpExecInfo->lpIDList=0;

	lpExecInfo->lpParameters=0;

	lpExecInfo->lpVerb=0;


	lpExecInfo->hwnd = hWnd;

	lpExecInfo->lpDirectory = m_DBSettings.m_DefaultDocPath + "\\Vorlage\\";

	lpExecInfo->lpFile = "scannen.dot";

	lpExecInfo->nShow = SW_SHOWMAXIMIZED;


	ShellExecuteEx(lpExecInfo);
So lässt es sich kompilieren, läuft aber neicht. Ich hatte Dein Post so vertanden:
SHELLEXECUTEINFO *LPSHELLEXECUTEINFO;

*LPSHELLEXECUTEINFO lpExecInfo;

Aber das lässt sich nicht kompilieren. :rolleyes: *seuftz*

ICH HASSE POINTER!!!!

Danke für die ausführliche erklärung.

Aber ganz kapiert hab ichs noch nicht. Schau mal:

	SHELLEXECUTEINFO *lpExecInfo;
//Dokumentenvorlage zum Scannen öffnen
lpExecInfo->cbSize = sizeof(SHELLEXECUTEINFO);[/code] Gleiches Problem wie vorher: Uninitialisierter Zeiger.
[code]SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof SHELLEXECUTEINFO;
usw...

Dankeschön!!! :e@sy

Das öffnen klappt jetzt!!

Allerdings seht in meinem hProcess immer das selbe drin. Egal ob ich Word schließe oder nicht.

Der Inhalt ist immer 4294967295.

Was sitmmt da nicht?

	ShellExecuteEx(&lpExecInfo);

	test = WaitForSingleObject(lpExecInfo.hProcess, 2000);


	//Warten bis Word beendet ist.

	while (test != WAIT_OBJECT_0)

		{

		test = WaitForSingleObject(lpExecInfo.hProcess, 2000);

		}

..........:floet:

Ok *in die ecke stell und schäm*

aber es geht immer noch nicht. da steht immernoch die selbe zahl in test.

	DWORD WINAPI test;

	HWND hWnd;

	CString csPfad = m_DBSettings.m_DefaultDocPath + "\\Vorlage\\";


	//Struktur zum Öffnen mit ShellExecuteEx

	SHELLEXECUTEINFO lpExecInfo = {0};

	lpExecInfo.hProcess = hWnd;

	lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;

	lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);

	lpExecInfo.lpDirectory = csPfad;

	lpExecInfo.lpFile = "scannen.dot";

	lpExecInfo.nShow = SW_SHOWMAXIMIZED;



	ShellExecuteEx(&lpExecInfo);

	test = WaitForSingleObject(lpExecInfo.hProcess, INFINITE );


	//Warten bis Word beendet ist.

	while (test != WAIT_OBJECT_0)

		{

		test = WaitForSingleObject(lpExecInfo.hProcess, INFINITE );

		}

Läuft Word möglicherweise schon? Ein Prozesshandle bekommst du nur, wenn durch ShellExecuteEx auch wirklich ein Prozess gestartet wird.

Was gibt ShellExecuteEx zurück?

Was steht in lpExecInfo.hProcess?

Was gibt WaitForSingleObject zurück?

Ok, Du hast es wieder mal auf Anhieb erraten!

Also es ist so. Ich verwende Office 2003 und da läuft Word als Prozess im Hintergrund wenn Outlook aktiv ist. Also wird der Prozess niemals wirklich beendet. Selbst wenn ich Outlook schließe, Word öffne und dann wieder beende läuft der prozess weiter im Hintergrund.

Erst wenn ich den Prozess im Taskmanager abwürge läuft mein Programm dann weiter. Also tut mein Programm im Grunde das, was es soll... Nur Word nicht...

Was ein Sch*** :(

Was nun? Hast Du noche ine Idee?

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.