Nicht globale Hotkeys?



  • Huhu hab n kleines problem mit Hotkeys. Schreibe n kleines chat programm und will enter als programminternen hotkey festlegen um nachrichten zu senden.
    Das sieht so aus:

    case WM_CREATE:
    RegisterHotKey(hwnd,VK_RETURN,0,VK_RETURN);
    

    und dann die abfrage:

    case WM_HOTKEY:
    if((wParam==VK_RETURN) && (con==true)) 
    { "Senden();" }
    

    das macht den hatkey aber global, also auch wenn der focus nicht mein programm ist. Dummerweise wird die enter taste damit komplett blockiert, also auch in anderen programmen.
    Als Alternative habs ich mit WM_KEYDOWN: versucht, keydown wird aber nicht weitergegeben wenn der focus eine textbox ist. was ich auch versucht habe ist das event weiterzugeben:

    case WM_HOTKEY:
    if((wParam==VK_RETURN)&& (GetFocus()==MeineHWND) && (con==true)) 
    { "Senden();" }
    else{ return DefWindowProc (MeineHWND, message, wParam, lParam); }
    

    was aber auch nicht klappt.
    Kann man einen hotkey irgendwie local registrieren oder hat jemand ne andere idee?
    mfg Ic3Hawk





  • Könnte jemand bitte etwas genauer werden?





  • hier ausnahmsweise:

    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
     	// TODO: Place code here.
    	MSG msg;
    	HACCEL hAccelTable;
    
    	// ...
    
    	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_ASA);
    
    	// Main message loop:
    	while (GetMessage(&msg, NULL, 0, 0)) 
    	{
    		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    	}
    
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	int wmId, wmEvent;
    
    	switch (message) 
    	{
    		case WM_COMMAND:
    			wmId    = LOWORD(wParam); 
    			wmEvent = HIWORD(wParam); 
    			// Parse the menu selections:
    			switch (wmId)
    			{
    				case IDM_TOLL:
    				   MessageBox(hWnd, "Es ist sehr toll", "", 0);
    				   break;
    // ......
    

    Das kannst du dir auch im VS generieren lassen mein Freund, zumindest bei VS6, ich weiß ned ob die neuen das auch noch machen.



  • sry kenne mich mit Accelerators net aus.
    Wo kann ich da festlegen welche taste ich hooken will?



  • in der Accelerator Resource, die du deinem Programm hinzugefügt hast.



  • wie gesagt ich hab noch nie damit gearbeitet, auch net mit recourcen, Ich arbeite mit Dev-C++. War noch nie nötig mit recourcen zu arbeiten.
    Gibts nicht einen anderen weg?
    mfg



  • NEIN gibts nicht. Mehr als den Code dir hier zu präsentiere und dir ans Herz zu legen, dich auf der MSDN SCHLAU zu lesen, kann ich nicht tun.

    Du LÄDST eine Accelerator Resource mit LoadAccelerators und baust dann TranslateAccelerator in deine Nachrichtenschleife an, wie oben gezeigt. EINFACHER geht es nicht.



  • Benutz lieber einen Button. Der löst bei Enter WM_COMMAND mit IDOK aus, wenn er der Default-Push-Button ist.


Anmelden zum Antworten