Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


SendMessage

Postades av 2003-08-19 16:59:16 - Johan Bovin, i forum c# (c-sharp), Tråden har 2 Kommentarer och lästs av 889 personer

Hej
Är det nån som kan ge mig ett bra exempel på hur man kan skicka en sträng från en applikation till en annan med hjälp av SendMessage. Det jag skulle vilja göra är att skicka vidare en commandline till en redan startad applikation?

Alltså:
1, hur skickar jag?

2, hur tar jag emot?


Svara

Sv: SendMessage

Postades av 2003-08-19 18:33:26 - Mattias Sjögren

Här är ett exempel på ett program som gör det.

<code>
// singleinstance.cs
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;


struct COPYDATASTRUCT
{
public IntPtr dwData;
public uint cbData;
public IntPtr lpData;
}

class MyForm : Form
{
public MyForm(string fileName)
{
Text = "My App";
OpenFile( fileName );
}

internal void OpenFile(string fileName)
{
// öppna filen här
MessageBox.Show( "Öppnar " + fileName );
}

protected override void WndProc(ref Message m)
{
if ( m.Msg == (int)MyApp.WM_COPYDATA ) {
COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam( typeof(COPYDATASTRUCT) );
if ( cds.dwData == MyApp.MSG_OPENFILE ) {
string fileName = Marshal.PtrToStringUni( cds.lpData );
Debug.Assert( 2 * (1 + fileName.Length) == cds.cbData );
OpenFile( fileName );
}
}

base.WndProc( ref m );
}
}

class MyApp
{
internal const uint WM_COPYDATA = 0x4A;
internal static readonly IntPtr MSG_OPENFILE = (IntPtr)1; // valfritt värde

[DllImport("user32.dll", CharSet=CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, ref COPYDATASTRUCT lParam);

[DllImport("user32.dll", CharSet=CharSet.Auto)]
static extern bool SetForegroundWindow(IntPtr hWnd);

[STAThread]
static void Main(string[] args)
{
if ( args.Length == 0 )
return;

Process[] existing = Process.GetProcessesByName( "singleinstance" );
Process me = Process.GetCurrentProcess();
Process other = null;
foreach ( Process p in existing )
if ( p.Id != me.Id && p.MainWindowHandle != IntPtr.Zero ) {
other = p;
break;
}

if ( other != null ) {
COPYDATASTRUCT cds;
cds.dwData = MSG_OPENFILE;
IntPtr p = Marshal.StringToHGlobalUni( args[0] );
cds.lpData = p;
cds.cbData = (uint)(2 * (args[0].Length + 1));
SendMessage( other.MainWindowHandle, WM_COPYDATA, IntPtr.Zero, ref cds );
SetForegroundWindow( other.MainWindowHandle );
Marshal.FreeHGlobal( p );
return;
}

Application.Run( new MyForm( args[0] ) );
}
}
</code>

Tyvärr är Process klassen rätt slö, och Process.GetProcessesByName() kan förlänga starttiden märkbart, så du kan ju fundera på att använda något annat sätt för att indikera att en instans av programmet redan körs, t.ex. en global mutex.


MS


Svara

Sv: SendMessage

Postades av 2003-08-20 10:19:15 - Johan Bovin

Stort tack till MS, du är en grym klippa....
Har försökt ändra lite så att det skall passa. Har även försökt lägga till en Mutex med identifieraren som blir pathen där .exe:n ligger, så man kan starta flera instanser av samma exe, så länge det inte är samma... (kollar iofs bara att det om man kör in med argument)

<code>
static void Main(string[] args)
{
string m_UniqueIdentifier = Application.ExecutablePath.Replace("\\", "_");
System.Threading.Mutex m_Mutex = new System.Threading.Mutex(false, m_UniqueIdentifier);



//Process me = Process.GetCurrentProcess();
if ( args.Length == 0 )
{
Application.Run(new Form1());
}
else
{
if(m_Mutex.WaitOne(1,true))
{
//first instance
Application.Run(new Form1(args[0]));
}
else //another process is running
{

string assemblyName = Assembly.GetExecutingAssembly().GetName().Name;

Process[] existing = Process.GetProcessesByName(assemblyName );
Process me = Process.GetCurrentProcess();
Process other = null;
foreach ( Process p in existing )
if ( p.Id != me.Id && p.MainWindowHandle != IntPtr.Zero )
{
other = p;
break;
}

if ( other != null )
{
COPYDATASTRUCT cds;
cds.dwData = MSG_OPENFILE;
IntPtr p = Marshal.StringToHGlobalUni( args[0] );
cds.lpData = p;
cds.cbData = (uint)(2 * (args[0].Length + 1));
SendMessage( other.MainWindowHandle, WM_COPYDATA, IntPtr.Zero, ref cds );
SetForegroundWindow( other.MainWindowHandle );
Marshal.FreeHGlobal( p );
return;

}
}
}
}
</code>

Jag vet inte om det finns några smartare sätt att på tag WindowHandle för det andra fönstret, men kom fram till att jag inte kunde använda FindWindow eftersom jag tillåter flera fönster... annars hade ju det varit ett alternativ. Jag är grymt nöjd med detta iallafall. Tack igen MS


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 155
27 952
271 704
3 250
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies