Avatar billede Slettet bruger
12. februar 2011 - 22:11 Der er 11 kommentarer og
1 løsning

PostMessage returnere 1, men virker ikke?

Jeg prøver at konvertere noget VB til C#, men er rendt ind i et problem. Jeg laver et PostMessage call til at musen skal klikke et bestemt sted. PostMessage returnere 1, men intet sker?
Lad mig vise noget kodning, så kan i måske få øje på problemet.

Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_CHAR = &H102
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202

Har jeg konverteret til:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd,
                                      int Msg,
                                      int wParam,
                                      int lParam);
public const Int32 WM_KEYDOWN = 0x0100;
public const Int32 WM_KEYUP = 0x0101;
public const Int32 WM_CHAR = 0x0102;
private const Int32 WM_LBUTTONDOWN = 0x0201;
private const Int32 WM_LBUTTONUP = 0x0202;

Og:

PostMessage(handle, WM_LBUTTONDOWN, 1, (y << 16) Or x)

Til:

PostMessage(handle, WM_LBUTTONDOWN, 1, (y << 16) | x);

Jeg har også prøvet at sende tast input, men stadig intet sker?
Parametrene til PostMessage kan være forkerte, så vidt jeg husker skal nr. 2 være uint, 3. skal være IntPtr og det samme med 4. Men hvis jeg ændre disse siger den, at den ikke kan konvertere fra int til IntPtr.
Avatar billede Syska Mester
12. februar 2011 - 22:24 #1
Denne side siger:
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

Så der er lidt forskel ...

Men ingen ide om overstående virker.

mvh
Avatar billede Syska Mester
12. februar 2011 - 22:25 #2
Linket kom selvfølgelig ikke med:
http://pinvoke.net/default.aspx/user32/PostMessage.html

mvh
Avatar billede Slettet bruger
12. februar 2011 - 22:31 #3
Også lidt ala det jeg havde tænkt, men problemet er så at den ikke kan konvertere (y << 16) | x) fra int til IntPtr, og det samme med argument 1 og 3.

En ting der lige slog mig var, at jeg faktisk ikke ved om originalen virker. Hmm..
Avatar billede arne_v Ekspert
13. februar 2011 - 00:40 #4
IntPtr har da en constructor som tager en int som argument.
Avatar billede Slettet bruger
13. februar 2011 - 01:26 #5
Ahhh.. Har stadig ikke helt styr på IntPtr (ikke engang tæt på), men fik da alle konversion fejl væk, men det virker stadig ikke.

Hvordan skal jeg kalde PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);, når jeg har et IntPtr som argument nr 1 og ikke en HandleRef?
Avatar billede Syska Mester
13. februar 2011 - 01:44 #6
GetHandleBy something på dit vindue. ( mener jeg )
Avatar billede Slettet bruger
13. februar 2011 - 01:52 #7
Nu bliver jeg, undskyld sproget, sgu godt nok i tvivl om originalen i VB overhovedet virker. Prøvede at lave et lille VB projekt hvor jeg bare tyv stjal koden fra originalen, og samme sker. Den returnere ikke 0 og der sker intet.

Har lige et par ting jeg skal tjekke, jeg vender frygteligt tilbage.
Avatar billede Slettet bruger
13. februar 2011 - 02:13 #8
Er der nogen der kan give et eksempel på brug af PostMessage til at klikke og skrive i f.eks. notepad? Processen skal findes ved at gennemgå hver process efter navnet Notepad (eller notesblok hvis det nu er).
Avatar billede Slettet bruger
13. februar 2011 - 02:59 #9
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);

public const Int32 WM_KEYDOWN = 0x0100;
public const Int32 WM_KEYUP = 0x0101;
public const Int32 WM_CHAR = 0x0102;
private const Int32 WM_LBUTTONDOWN = 0x0201;
private const Int32 WM_LBUTTONUP = 0x0202;

...

SendMessage((int)Diablo2Handle, WM_LBUTTONDOWN, 1, (y << 16) | x);

og FindWindow til at finde vinduet, fik det til køre.

Men der er stadig et problem, når jeg prøver at sende en tast, er det kun Keys.Enter der virker - øhmm halvt.

SendMessage((int)Diablo2Handle, WM_KEYDOWN, (int)key, 0);
SendMessage((int)Diablo2Handle, WM_KEYUP, (int)key, 0);

Hvorfor virker andre taster så som Keys.A og Keys.D1 ikke? Og hvorfor er det som om at tasten ikke bliver givet slip på, altså når vi snakker om Keys.Enter?
Avatar billede Slettet bruger
13. februar 2011 - 03:06 #10
Hov lige meget det virker fint, hvis i synes en af tingene jeg har gjort er dumt, vil jeg meget gerne vide det og hvad jeg skal gøre i stedet.

Tak for hjælpen! Smid et svar og modtag points og det gælder jer begge.
Avatar billede Syska Mester
13. februar 2011 - 04:04 #11
svar

Hvis du vil lave macro ting, så kan http://www.blueeye-macro.com/index.php anbefales.

mvh
Avatar billede Slettet bruger
13. februar 2011 - 17:19 #12
Da arne_v ikke har lagt et svar, så får du bare alle points.

Tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester