C# PostMessage syntax, versuchen zu buchen, eine WM_CHAR-anderen-Anwendungen-Fenster
public partial class Form1 : Form
{
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
public const Int32 WM_CHAR = 0x0102;
public const Int32 WM_KEYDOWN = 0x0100;
public const Int32 WM_KEYUP = 0x0101;
public const Int32 VK_RETURN = 0x0D;
public Form1()
{
InitializeComponent();
}
public bool working;
private void button1_Click(object sender, EventArgs e)
{
Process[] proc = Process.GetProcessesByName("processname");
if (proc[0] == null || proc.Length == 0)
{
Debug.WriteLine("Process not found.");
return;
}
foreach (char c in textBox1.Text)
{
//char ascii value in decimal
int charValue = c;
//char ascii value in hex
string hexValue = charValue.ToString("X");
IntPtr val = new IntPtr(c);
Debug.WriteLine(c + " = dec: " + charValue + ", hex: " + hexValue + ", val: " + val);
PostMessage(proc[0].MainWindowHandle, WM_KEYDOWN, val, new IntPtr(0));
PostMessage(proc[0].MainWindowHandle, WM_CHAR, val, new IntPtr(0));
PostMessage(proc[0].MainWindowHandle, WM_KEYUP, val, new IntPtr(0));
PostMessage(proc[0].MainWindowHandle, WM_KEYDOWN, new IntPtr(VK_RETURN), new IntPtr(0));
PostMessage(proc[0].MainWindowHandle, WM_KEYUP, new IntPtr(VK_RETURN), new IntPtr(0));
}
}
}
Wenn ich val = char 'm'
(die Dez: 109, hex: 0x6D) dann, wenn das Fenster die Nachricht erhält, zeigt es die char - ' - ' aus irgendeinem Grund (die Dez 45, hex 0x2D). Ich hatte erst den Verdacht hex/dec, die dann Fragen, aber ich irrte mich.
Als winapi-Neuling, mein problem scheint zu sein, mit PostMessage () - syntax. Wie kann ich senden Sie die richtige Botschaft an die Fenster zeigen das richtige Zeichen?
- Du grundlegend falsch, was hex ist, Lesen Sie Petzold "Code" - Buch. Nur senden WM_CHAR-Meldungen, pass new IntPtr(charValue). Und SendMessage verwenden, nicht PostMessage.
- Wenn möglich, bevorzugen
SendInput
sendenWM_KEYDOWN
/WM_KEYUP
direkt, und lieberWM_KEYDOWN
/WM_KEYUP
sendenWM_CHAR
direkt. @HansPassant Warum Sie empfehlen die Verwendung von SendMessage?
Du musst angemeldet sein, um einen Kommentar abzugeben.
0x6C und 108 sind das gleiche in C#, die beide ganze zahlen sind, so...
und
sind funktional equivilant.
Daher in deinem obigen code, sollten Sie in der Lage sein zu verwenden:
Die Quelle all meiner Verwirrung resultierte aus der
PostMessage
syntax fürWM_CHAR
. Ich nahm an, diewParam
war ein standard-ascii-hex-keycode und es war nicht. Es war eigentlich eine (hex -) virtual keycode.Dies erklärt, warum 0x6D war das versenden von minus anstelle von 'm'!