Problem mit Windows Programm [switch(wParam)] [gelöst]
-
Jochen S. schrieb:
Hallo Skullyan,
Es ist mir im Moment nicht ganz klar, worauf der Benutzer des Programms eigentlich klicken soll.
Soll der Benutzer auf einen bestimmten Button klicken, könnte man das folgendermaßen realisieren:
switch(message) // Die Nachricht, die an die Fensterfunktion übergeben wird { //... case WM_COMMAND: { if(lParam == (LPARAM)hButton) { if(HIWORD(wParam) == BN_CLICKED) { // Hier beliebigen Code einfügen, der ausgeführt werden soll, // Wenn der Benutzer auf den Button mit dem Handle hButton klickt. } } return 0; } //... }Soll der Benutzer allerdings nur auf eine Beliebige Stelle deines Fensters klicken, kann man den Klick so registrieren:
switch(message) // Die Nachricht, die an die Fensterfunktion übergeben wird { //... case WM_LBUTTONDOWN: { // Beliebiger Code // Die koordinaten des Mauszeigers sind in lParam Gespeichert. // y-Koordinate: HIWORD(lParam), x-Koordinate: LOWORD(lParam) return 0; } //... }Ich hoffe, ich konnte dir weiterhelfen.
MfG, Jochen
Mit dem Klick funktioniert das schon ganz gut. Mein Problem ist auch ganz anderer Natur. Ich möchte nämlich, dass der Codeblock von oben bei JEDEM Klick NOCHMALS ausgeführt wird. Und nicht nur einmal am Anfang des Programmes.
-
Versteht keiner mein Anliegen?
-
Hallo Skullyan,
Versuch mal folgendes:
if(HIWORD(wParam) == BN_CLICKED) // ein button wurde geklickt. switch(LOWORD(wParam)) { //... case 8: // Dein Code, der bei eimen Klick ausgeführt werden soll return 0; // weitere case-Marken }Also anstatt wParam LOWORD(wParam) in der switch-Verzweigung
Und die switch-Verzweigung nur ausführen, wenn HIWORD(wParam) gleich BN_CLICKED ist.Ich hoffe, dass es das ist, was du brauchst.
MfG, Jochen
-
Jochen S. schrieb:
Hallo Skullyan,
Versuch mal folgendes:
if(HIWORD(wParam) == BN_CLICKED) // ein button wurde geklickt. switch(LOWORD(wParam)) { //... case 8: // Dein Code, der bei eimen Klick ausgeführt werden soll return 0; // weitere case-Marken }Also anstatt wParam LOWORD(wParam) in der switch-Verzweigung
Und die switch-Verzweigung nur ausführen, wenn HIWORD(wParam) gleich BN_CLICKED ist.Ich hoffe, dass es das ist, was du brauchst.
MfG, Jochen
Nein, leider löst das mein Problem nicht. Also das Verhalten des Codeblocks ist, dass er einen beliebigen Prozess terminiert. Das funktioniert allerdings nur bei allen Prozessen, die VOR dem Starten meines Programmes schon liefen. Wenn man während der Laufzeit meines Programmes ein neues Programm startet und es dann mit meinem Programm schließen will, geht das nicht. Woran liegt das?

-
Ich weiss nicht, ob dir das jetzt weiterhilft, aber hier ist eine Funktion, die einen beliebigen Prozess beendet:
bool Convert(wchar_t* wStr,char* buffer) { if(!wStr||!buffer)return false; for(int i=0;wStr[i]!='\0';i++)buffer[i]=(char)wStr[i]; buffer[lstrlenW(wStr)]='\0'; return true; } bool KillProcessA(const char* pcProcessName) { bool found = false; if(!pcProcessName)return false; HANDLE hSnapshot; HANDLE hProcess; PROCESSENTRY32 ProcessEntry; ProcessEntry.dwSize = sizeof(PROCESSENTRY32); hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if(Process32First(hSnapshot, &ProcessEntry)) do { char str[300]; #ifdef UNICODE Convert(ProcessEntry.szExeFile,str); #else strcpy(str,pcProcessName); #endif if(!stricmp(str,pcProcessName)) { HANDLE hProcess; hProcess = OpenProcess(PROCESS_TERMINATE,false,ProcessEntry.th32ProcessID); TerminateProcess(hProcess,0); CloseHandle(hProcess); found = true; } } while(Process32Next(hSnapshot, &ProcessEntry)); CloseHandle(hSnapshot); return found; }Die funktion kann auch einen zur laufzeit gestarteten Prozess beenden.
Die Funktion Convert ist allerdings schonin deinem Programm vorhanden, wie ich sehe. Die Funktion liefert false zurück, sollte der angagebene Prozess nicht gefunden werden.
Ich hoffe, das hilft dir.MfG, Jochen
-
case 8: //Text vom Editfeld in einem Puffer speichern GetWindowTextA(hwndEdit,buf,65); strcat(buf,".exe"); HANDLE po; PROCESSENTRY32 pe; int NumProcesses = 0; char str[300]; int help = 0; po = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); pe.dwSize = sizeof(PROCESSENTRY32); if(Process32First(po,&pe)) do { ++NumProcesses; } while(Process32Next(po, &pe)); Process32First(po,&pe); for(int i = 0; i < NumProcesses-1; ++i) { ++help; Process32Next(po,&pe); Convert(pe.szExeFile,str); // cout << pe.szExeFile << " " << pe.th32ProcessID << " "; if(!strcmp(str,buf)) break; } // Fehler abfangen if(NumProcesses == help+1) { MessageBoxW(hWnd,L"Prozess läuft nicht.",L"Fehler", MB_OK); return 0; } HANDLE hProcess; hProcess = OpenProcess(PROCESS_TERMINATE,TRUE,pe.th32ProcessID); TerminateProcess(hProcess,NULL);Da, wo "Fehler abfangen" steht, ist der Fehler. Wie kann ich sonst auf Fehler prüfen? Also auf falsche Eingaben...
-
Fehler in der for-Schleife. Der letzte Prozess wird nie berücksichtigt.
-
genauerguggen schrieb:
Fehler in der for-Schleife. Der letzte Prozess wird nie berücksichtigt.
Ich verstehe nicht so ganz... Kannst Du mir das zeigen?
-
Der letzte Prozess in der Liste wird in der for-Schleife nie geprüft. Probier mal so:
//for(int i = 0; i < NumProcesses-1; ++i) for(int i = 0; i < NumProcesses; ++i)
-
genauerguggen schrieb:
Der letzte Prozess in der Liste wird in der for-Schleife nie geprüft. Probier mal so:
//for(int i = 0; i < NumProcesses-1; ++i) for(int i = 0; i < NumProcesses; ++i)Ich habe es gelöst:
//Text vom Editfeld in einen Puffer speichern GetWindowTextA(hwndEdit,buf,65); strcat(buf,".exe"); HANDLE po; PROCESSENTRY32 pe; int NumProcesses = 0; char str[300]; int help = 0; po = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); pe.dwSize = sizeof(PROCESSENTRY32); if(Process32First(po,&pe)) do { ++NumProcesses; } while(Process32Next(po, &pe)); Process32First(po,&pe); for(int i = 0; i < NumProcesses; ++i) { ++help; Process32Next(po,&pe); Convert(pe.szExeFile,str); // cout << pe.szExeFile << " " << pe.th32ProcessID << " "; if(!strcmp(str,buf)) break; } // Fehler abfangen if(help == NumProcesses) { return 0; } HANDLE hProcess; hProcess = OpenProcess(PROCESS_TERMINATE,TRUE,pe.th32ProcessID); TerminateProcess(hProcess,NULL); return 0;
-
skullyan schrieb:
Ich habe es gelöst:
Klar DU hast es gelöst. Und warscheinlich hast du auch ein Heilmittel gegen Selbstüberschätzung gefunden.
-
..... schrieb:
skullyan schrieb:
Ich habe es gelöst:
Klar DU hast es gelöst. Und warscheinlich hast du auch ein Heilmittel gegen Selbstüberschätzung gefunden.
Nein, das warst DU!