Shellexeute i msg

0

Witam

Mam procedurę która wysyła za pomocą shellexecute i dosowego MSG komunikat do użytkownika domenowego. Procedura wygląda następująco:

var
t, k : String;
begin
t := 'Administrator';
k := 'Tresc do wyswietlenia';
ShellExecute(Handle, 'open', 'msg', PChar(t+' '+k), nil, SW_SHOW);
end;

Polecenie MSG posiada parametr /W, które zwraca jakąś wartość, a dokładnie informuje o tym, iż użytkownik przeczytał wiadomość(kliknął OK). Chciałbym zbierać i zapisywać informacje o tym, iż dany użytkownik przeczytał wiadomość czyli kliknął OK. W jaki sposób przejąć tę informację z polecenia MSG ??

Docelowo program ma wysyłać komunikat do użytkowników domenowych w sieci LAN. Użytkownicy będą wpisywani z palca ewentualnie wybierani z listy ale to już oddzielny temat ;)

Pozdrawiam
Jacek

0

może spróbuj użyć MessageBox albo ShowMessage zamiast kombinować - nie będziesz miał takich problemów

0

Problem jest tej natury, że komunikat ma się pojawić niezależnie od tego co w danym momencie robi użyszkodnik. A ten może np korzystać z połączenia terminalowego, może połączenie terminalowe mieć zminimalizowane, może pisać cosik w wordzie. No chyba, że MessageBox czy też ShowMessage byłyby w stanie "wyskoczyć" zawsze na środek ekranu niezaleznie od tego co robi użyszkodnik. No i w tym wypadku nie wiem czy nie będę musiał czegoś instalować u każdego użyszkodnika, a tego bym nie chciał.

0

Zamiast ShellExcecute użyj CreateProcess i CreatePipe i wtedy sobie parsuj wyjście konsoli.

0

kAzek -zapewne masz racje, niestety jestem laikiem, dlatego chciałbym Cię poprosić, abyś podał mi przykład jak wykorzystać te funkcje i czym się różnią... mam prośbę abyś nie odsyłał mnie helpa..

0

może łatwiej dać MessageBoxa w wątku?

0

Program musi robić dwie rzeczy:

  1. Wysyłać wiadomości do określonych użytkowników w sieci lan w domenie.
  2. Zbierać informacje o tym, że użytkownik zapoznał się z komunikatem.

Ważne: posiadam informacje o adresie IP wszystkich komputerów do których będę wysyłał komunikaty, nazwy użytkowników domenowych (z których chciałbym korzystać) ale nie chcę niczego u użytkowników instalować.

0

W Google masz pełno np. http://stackoverflow.com/questions/5422143/embedded-console-applications-in-delphi tylko zamiast TMemo jak to co miało być na konsoli nie musi być widoczne daj jakiś TStringList (na początek zostaw memo będziesz widział co sie dzieje).

A tym się różnią że dzieki CreatePipe zamiast czarnego okienka konsoli wszystko co było w konsoli będzie w Memo a więc łatwo będziesz mógł odczytać.

0

Jak masz FPC/Lazarus to użyj TProcess - zawiera wszystko co się przyda do obsługi programów uruchamianych zewnętrznie (w tym kod zwrotny).

0

No to się poddałem. Nie jestem w stanie za pomocą MSG wysłać komunikatu do użytkownika, który jest podłączony do domeny ale nie korzysta z servera terminalowego.

Czy jest na to sposób w Delphi ?

0

https://forums.embarcadero.com/thread.jspa?messageID=418658
ale lepiej bezpośrednio to:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa383842.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa383833.aspx

var
  SessionInfo: PWTS_SESSION_INFO;
  SessionCount: DWORD;
  Response: DWORD;
begin
  Title := 'Message Title';
  Message := 'Message text here';
 
  if WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, @SessionInfo, 
@SessionCount) then
  begin
    for I := 0 to SessionCount-1 do
      WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, SessionInfo[I].SessionId, 
PChar(Title), ByteLength(Title), PChar(Message), ByteLength(Message), MB_OK, 
5000, @Response, True);
    WTSFreeMemory(SessionInfo);
  end;
end;
0

Boshe - nic z tego nie rozumiem ;(

0

A co chcesz zrozumieć?
Odpalając msg.exe w ten sposób nie masz dostępu do informacji o tym czy użytkownik dostał tą informacje czy nie.
Można odpalać to przez createprocess z opcją /V podmieniając stdout i stderr na jakiś strumień, po czym analizować tekst ze strumienia.
Z tym że o wiele prościej dopasować gotowca, w nim jak podasz opcję czekania to nawet wiesz jak użytkownik zamknął okienko (przez krzyżyk czy przez ok).
Ba możesz dać więcej przycisków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1