Forum: PC-Programmierung GetProcessId liefert immer 0


von Programmierer (Gast)


Lesenswert?

Hallo zusammen

Ich wollte zum testen für ein späteres Projekt versuchen, die ProcessId 
von dem Fenster, über dem sich der Cursor befindet, zu ermitteln.
Das ganze habe ich in VS gemacht auf einem Computer mit Windows 7 X64.
Dazu habe ich dieses simple Programm geschrieben:
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Linq;
7
using System.Text;
8
using System.Windows.Forms;
9
using System.Runtime.InteropServices;
10
using System.Diagnostics;
11
12
namespace BeispielMausposProcessId
13
{
14
    public partial class Form1 : Form
15
    {
16
        [DllImport("user32.dll")]
17
        public static extern IntPtr WindowFromPoint(Point lpPoint);
18
        [DllImport("kernel32.dll", SetLastError = true)]
19
        static extern int GetProcessId(IntPtr hWnd);
20
21
        IntPtr window;
22
        Process proc;
23
        public Form1()
24
        {
25
            InitializeComponent();
26
        }
27
28
        private void timer1_Tick(object sender, EventArgs e)
29
        {
30
            window = WindowFromPoint(new Point(System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y));
31
            int procId = GetProcessId(window);
32
            proc = Process.GetProcessById(procId);
33
            this.Text += "  " + Convert.ToString(proc.Id);
34
        }
35
    }
36
}

Nun liefert GetProcessId aber immer nur den Wert 0. Das Handle von 
WindowFromPoint liefert allerdings noch unterschiedliche Werte. Also 
sollte das Problem schon mit GetProcessId zu tun haben.
In Hoffnung auf eine gute Lösung
Ein verzweifelter Hobby-Programmierer

von Sam .. (sam1994)


Lesenswert?

So was ist evtl. mit der int. System.Diagnostics.Process Klasse zu 
erledigen, ohne dll import (damit hab ich bisher fast noch nichts 
gemacht).

von Peter II (Gast)


Lesenswert?

wenn ich die doku richtig lese, dann kann man GetProcessId kein 
Windowshandel übergeben - es will ein Processhandle haben

http://msdn.microsoft.com/en-us/library/ms683215(v=vs.85).aspx

von Jens G. (jensig)


Lesenswert?


von Programmierer (Gast)


Lesenswert?

Vielen Dank für die bisherigen Antworten.
Mit der Funktion GetWindowThreadProcessId hat es nun funktioniert.

Aber nun auch schon zum nächsten Problem:
Ich habe den Code nun erweitert und möchte bei jedem Timer-Tick (3 sek) 
einmal mit der Maus an der Position, an der sie ist, klicken.
Dazu habe ich folgende erweiterungen vorgenommen:

...
1
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
2
        static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
...

...
1
private void timer1_Tick(object sender, EventArgs e)
2
        {
3
            window = WindowFromPoint(new Point(System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y));
4
            ...
5
            SendMessage(window, 0x0201, 0, 0); //WM_LBUTTONDOWN
6
            SendMessage(window, 0x0202, 0, 0); //WM_LBUTTONUP
7
        }

Doch der Mausklick scheint nicht zu funktionieren. Nichtmal im eigenen 
Fenster. Was mache ich falsch?

von Sam .. (sam1994)


Lesenswert?

Das hab ich mal in einem Projekt von mir genutzt:
http://dotnet-snippets.de/dns/maus-kontrollieren-SID432.aspx

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.